我最近在安装某些模块时遇到了麻烦,令我惊讶的是,许多已安装的模块具有重复的安装和版本。尝试使用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
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';
@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
结果是cpan-outdated -p --verbose
显示的过期模块列表与cpan -lO
完全不同(并且更短)。不用说,模块到处都是安装的,我不知道如何了解是否存在默认安装位置以及默认安装位置,或者应该去。
问题:
core
,vendor
和site
路径的类型有什么区别?答案 0 :(得分:7)
关于这些安装位置的最佳参考可能是ExtUtils::MakeMaker文档,其中提供了安装位置。本质上:
core
(也称为 privlib )-是与Perl一起安装的核心模块所在的位置。在低于5.12的Perls上,还需要在此处通过核心版本安装对双生存期模块的更新,而不是在站点或供应商lib中安装,因为privlib在5.12之前位于@INC
中。这在系统Perl中尤其危险,在该系统中,privlib中的文件通常由程序包管理器管理。vendor
-分发供应商可以在其中安装模块。通常,系统软件包管理器是在其中安装非核心模块的地方。site
-CPAN客户端在直接调用时将模块安装到该位置,除非有异常配置,例如上述的双寿命模块。(双重生命模块是核心模块,在CPAN上也可以单独使用,这意味着您可以安装更新的版本。)
每个库位置都有一个 arch
变体,在该变体中安装了具有特定于构建的输出文件的发行版。没有动态配置的纯Perl发行版将安装到与体系结构无关的标准目录中,并且只要满足其要求,通常就可以在其他Perl和体系结构安装中未经修改地运行(尽管这不是一个好主意,除非您真的知道自己是什么)在做)。 具有任何已编译XS模块或在构建过程中动态生成模块的发行版都安装在arch
目录中,因此不能从其他Perl使用。
所有这些位置都是在构建Perl时配置的,可以使用显示的perl -V
选项进行发现。它们每个都有伴随的script
和bin
目录(通常是相同的)和联机帮助目录。
关于cpan-outdated
的差异-该工具(就像许多使用ExtUtils::Installed的工具一样)仅限于查找具有包装清单的模块,这些模块在安装模块时会包括在内使用CPAN客户端,但不使用核心模块,通常将它们与供应商包装分离。因此,cpan-outdated
很可能只会在 sitelib 中发现模块,但这通常就是您所需要的。我不确定cpan命令使用什么机制。
答案 1 :(得分:1)
更新:
由于 ikegami 的SO链接,我此后进行了一些源代码浏览,在这里我们可以找到很多有关此的信息。要获取更具体的位置:
# perl -V:'install(privlib|archlib|vendorlib|vendorarch|sitelib|sitearch)' |column -t -s "="
installarchlib '/usr/lib/perl5/5.26/x86_64-cygwin-threads';
installprivlib '/usr/share/perl5/5.26';
installsitearch '/usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads';
installsitelib '/usr/local/share/perl5/site_perl/5.26';
installvendorarch '/usr/lib/perl5/vendor_perl/5.26/x86_64-cygwin-threads';
installvendorlib '/usr/share/perl5/vendor_perl/5.26';
那么对于这些含义,我们可以在文件./Porting/Glossary
中(在perl源代码中)查看:
installarchlib '- is the same for modules with arch- or build-dependent components.'
installprivlib '- contains the "pure Perl" modules that came with Perl.'
installsitearch '- is the same for modules with arch- or build-dependent components.'
installsitelib '- contains the "pure Perl" modules installed by you.'
installvendorarch '- is the same for modules with arch- or build-dependent components.'
installvendorlib '- contains the "pure Perl" modules installed by your distro.'
,还有关于 installstyle 选项的其他有趣提示:
installstyle (installstyle.U):
此变量描述了perl安装的样式。这个 旨在用于需要操纵整个Perl的工具 分布。 Perl本身不使用它来查找其库- 库目录直接存储在Config.pm中。目前, 只有两种样式:
lib
和lib/perl5
。默认值 库位置(例如privlib,sitelib)为$prefix/lib
或$prefix/lib/perl5
。如果 $ prefix 是 专用于perl的目录(例如/ opt / perl),而后者是 如果$ prefix由许多软件包共享,则很有用,例如如果$prefix=/usr/local
。不幸的是,尽管此“样式”变量用于为 所有三个目录层次结构(核心,供应商和站点),没有 确保相同的样式实际上适合所有这些人 目录。例如,$ prefix可能是/ opt / perl,但是
$siteprefix
可能是/ usr / local。 (也许回想一下,“ lib” 样式本不应该得到支持,但看起来确实不错 当时的想法。)对于诸如MakeMaker等可以 用于将其他模块安装到非标准位置。对于 例如,如果用户打算将模块安装到私有环境中 目录(也许通过在Makefile.PL命令行上设置PREFIX), 那么就没有理由假设配置时间 $ installstyle设置与该PREFIX相关。
以后可能会扩展为包含其他信息,因此请小心 在结果上进行模式匹配。
为了与perl5.005和更早版本兼容,默认设置为 根据$ prefix是否包含字符串“ perl”。
所有坚韧的细节都可以在INSTALLATION
标题下的Installation Directories
文件中找到。
Directories for the perl distribution
:
默认情况下,Configure将使用以下目录(5.28.1):
Configure variable Default value
$prefixexp /usr/local
$binexp $prefixexp/bin
$scriptdirexp $prefixexp/bin
$privlibexp $prefixexp/lib/perl5/$version
$archlibexp $prefixexp/lib/perl5/$version/$archname
Directories for site-specific add-on files
:
Configure Default
variable value
$siteprefixexp $prefixexp
$sitebinexp $siteprefixexp/bin
$sitescriptexp $siteprefixexp/bin
$sitelibexp $siteprefixexp/lib/perl5/site_perl/$version
$sitearchexp $siteprefixexp/lib/perl5/site_perl/$version/$archname
Directories for vendor-supplied add-on files
:
如果要构建用于分发的perl的二进制分发,请配置 可以选择设置以下目录供您使用 分发附加模块。
Configure Default
variable value
$vendorprefixexp (none)
(The next ones are set only if vendorprefix is set.)
$vendorbinexp $vendorprefixexp/bin
$vendorscriptexp $vendorprefixexp/bin
$vendorlibexp $vendorprefixexp/lib/perl5/vendor_perl/$version
$vendorarchexp $vendorprefixexp/lib/perl5/vendor_perl/$version/$archname
otherlibdirs
:
最后,Configure还提供了一个$otherlibdirs
变量。
此变量包含以冒号分隔的其他目录列表
添加到 @INC 。默认情况下,它将为空。
APPLLIB_EXP
:
在perl构建中还有另一种向@INC添加路径的方法
时间,即通过设置APPLLIB_EXP C预处理程序
令牌。将APPLLIB_EXP定义的目录添加到
@INC 第一,先于其他任何人。
sh Configure -Accflags='-DAPPLLIB_EXP=\"/usr/libperl\"'