Perl中的核心,供应商和站点位置有什么区别?

not*_*bit 7 perl cygwin cpan cpanm

我最近在安装一些模块时遇到了一些问题,并且我惊讶地发现许多已经安装的模块都有重复的安装和版本.试图跟踪标准(如果有这样的东西)安装使用的东西cpanm,我发现以下结果非常混乱.

报告显示了这些位置:

  • 使用cpan -V:
# cpan -V

/usr/bin/cpan script version 1.672, CPAN.pm version 2.22
--------------------------------------------------
Checking install dirs...
Checking core
        + /usr/share/perl5/5.26
        + /usr/lib/perl5/5.26/x86_64-cygwin-threads
Checking vendor
        + /usr/share/perl5/vendor_perl/5.26
        + /usr/lib/perl5/vendor_perl/5.26/x86_64-cygwin-threads
Checking site
        + /usr/local/share/perl5/site_perl/5.26
        + /usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads
Checking PERL5LIB
        no directories for PERL5LIB
Checking PERLLIB
        no directories for PERLLIB
Run Code Online (Sandbox Code Playgroud)
  • 使用perl -V:.*site.*:
# perl -V:.*site.* |column -t -s "=" |sort -d -i -k 1.22

d_sitearch           'define';
usesitecustomize     'undef';
siteprefix           '/usr/local';
siteprefixexp        '/usr/local';
installsitebin       '/usr/local/bin';
installsitescript    '/usr/local/bin';
sitebin              '/usr/local/bin';
sitebinexp           '/usr/local/bin';
sitescript           '/usr/local/bin';
sitescriptexp        '/usr/local/bin';
installsitearch      '/usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads';
sitearch             '/usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads';
sitearchexp          '/usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads';
installsitehtml1dir  '/usr/local/share/doc/perl/html/html1';
sitehtml1dir         '/usr/local/share/doc/perl/html/html1';
sitehtml1direxp      '/usr/local/share/doc/perl/html/html1';
installsitehtml3dir  '/usr/local/share/doc/perl/html/html3';
sitehtml3dir         '/usr/local/share/doc/perl/html/html3';
sitehtml3direxp      '/usr/local/share/doc/perl/html/html3';
installsiteman1dir   '/usr/local/share/man/man1';
siteman1dir          '/usr/local/share/man/man1';
siteman1direxp       '/usr/local/share/man/man1';
installsiteman3dir   '/usr/local/share/man/man3';
siteman3dir          '/usr/local/share/man/man3';
siteman3direxp       '/usr/local/share/man/man3';
installsitelib       '/usr/local/share/perl5/site_perl/5.26';
sitelib              '/usr/local/share/perl5/site_perl/5.26';
sitelib_stem         '/usr/local/share/perl5/site_perl/5.26';
sitelibexp           '/usr/local/share/perl5/site_perl/5.26';
Run Code Online (Sandbox Code Playgroud)
  • 使用@INC:
# perl -e 'print join("\n",@INC,"")'

/usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads
/usr/local/share/perl5/site_perl/5.26
/usr/lib/perl5/vendor_perl/5.26/x86_64-cygwin-threads
/usr/share/perl5/vendor_perl/5.26
/usr/lib/perl5/5.26/x86_64-cygwin-threads
/usr/share/perl5/5.26
Run Code Online (Sandbox Code Playgroud)

结果是cpan-outdated -p --verbose显示一个完全不同(和更短)的过时模块列表cpan -lO.毋庸置疑,模块安装在整个地方,我不知道如何理解是否存在默认安装位置以及它应该去哪里,或者应该去哪里.


问题:

  1. 那么究竟是什么之间的差异core,vendor以及site 类型的路径?
  2. 为什么每种类型都有2条路径?

Gri*_*nnz 9

这些安装位置的最佳参考可能是ExtUtils :: MakeMaker文档,用于安装内容.在本质上:

  • core(也称为privlib) - 与Perl一起安装的核心模块.在早于5.12的Perls上,双生命模块的更新也需要安装在核心版本上,而不是安装到站点或供应商lib中,因为privlib @INC在5.12之前排在第一位.这在Perl系统中尤其危险,其中privlib中的文件通常由包管理器管理.
  • vendor - 是分发供应商可以安装模块的地方.这通常是系统包管理器安装非核心模块的地方.
  • site - 是CPAN客户端在直接调用时安装模块的地方,除了如上所述的双生命模块之外的异常配置.

(双寿命模块是核心模块,也可以在CPAN上单独使用,这意味着您可以安装更新版本.)

这些lib位置中的每一个都有一个arch变体,即安装了特定于构建的输出文件的发行版.没有动态配置的pure-perl发行版安装在标准体系结构无关的目录中,并且通常可以在Perl和体系结构的其他安装中不加修改地运行,只要它们的要求仍然满足(尽管除非你真的知道你是什么,否则它不是一个好主意这样做).任何已编译的XS模块的分发或在构建过程中动态生成模块的分发都安装在arch目录中,并且从另一个Perl使用是不安全的.

所有这些位置都是在构建Perl时配置的,并且可以使用perl -V您显示的选项进行发现.它们每个都有附带的scriptbin目录(通常是相同的)和联机帮助页的目录.

至于差异cpan-outdated- 这个工具(就像许多使用ExtUtils :: Installed的工具一样)仅限于查找具有包列表的模块,这些模块在使用CPAN客户端安装模块时包含,但不包含核心模块,并且它们通常被剥离供应商包.所以很可能cpan-outdated只会发现sitelib中的模块,但这通常是你需要找到的.我不确定cpan命令使用什么机制.