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

时间:2019-01-31 22:40:02

标签: 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
  • 使用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完全不同(并且更短)。不用说,模块到处都是安装的,我不知道如何了解是否存在默认安装位置以及默认安装位置,或者应该去。


问题

  1. 那么corevendorsite路径的类型有什么区别?
  2. 为什么每种类型都有2条路径?

2 个答案:

答案 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选项进行发现。它们每个都有伴随的scriptbin目录(通常是相同的)和联机帮助目录。

关于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\"'