CPAN在哪里安装模块?

时间:2017-10-16 20:03:42

标签: perl cpan

我无法找到CPAN安装其文件的位置的权威/全面描述。我假设必须有一组规则并且它不像“XYZ目录”那么简单,因为,例如,Linux盒子上的多个用户可以运行CPAN,即使有一个Perl安装并且它仍然以某种方式工作。那么,那些规则是什么?

这个问题的第二部分:PERL5LIB环境变量的文档说它是“在查看标准库和当前目录之前查找Perl库文件的目录列表。”

我假设CPAN没有安装到标准库位置,因为可能是针对特定Perl版本修复的。那么CPAN可能会安装到PERL5LIB中吗?

最后,正如我已经提到过的,CPAN如何处理多个用户可能正在运行相同的Perl安装的事实?很抱歉,如果这是一个单独的问题,但似乎可能相关。

3 个答案:

答案 0 :(得分:9)

Perl指定了三组安装位置。

  • perl,用于Perl本身附带的模块。
  • vendor,适用于由perl二进制文件的提供商安装的模块。
  • site,用于使用cpan安装的模块。

这些集合中的每一个都提供了许多文件类型的安装位置。

                        Installation location
                        --------------------------------------------------------
Type of file            perl             vendor                 site
----------------------  ---------------  ---------------------  -------------------
Build-specific modules  installarchlib   installvendorarch      installsitearch
Modules                 installprivlib   installvendorlib       installsitelib
Binary programs         installbin       installvendorbin       installsitebin
Other programs          installscript    installvendorscript    installsitescript
man pages for scripts   installman1dir   installvendorman1dir   installsiteman1dir
man pages for modules   installman3dir   installvendorman3dir   installsiteman3dir
html docs for scripts   installhtml1dir  installvendorhtml1dir  installsitehtml1dir
html docs for modules   installhtml3dir  installvendorhtml3dir  installsitehtml3dir

您可以使用以下方法获取任何这些位置的路径:

perl -V:{var}

您可以使用以下方法获取这些位置的所有路径:

perl -V:'install.*'

这些是安装程序 [1] 使用的默认值。但是,两个最常用的安装程序允许用户进行安装以覆盖任何和所有这些。如果某个模块安装在非标准位置,则可以使用PERL5LIBperl知道在哪里找到该模块。

  1. CPAN不安装模块。它是一个存储库。

    cpan没有安装模块。 cpan从CPAN下载发行版并运行Makefile.PLBuild.PL中提供的安装程序。 (同样适用于cpanmcpanp。)

    这些脚本大多使用ExtUtils::MakeMakerModule::Build自行安装(尽管存在其他安装程序)。

答案 1 :(得分:4)

CPAN实际上并不安装文件。它运行嵌入在每个发行版中的安装脚本,然后执行实际安装。

对于使用ExtUtils::MakeMaker的发布,默认值记录在此处:https://metacpan.org/pod/ExtUtils::MakeMaker#make-install(默认值INSTALLDIRSsite)。对于Module::Build,请参阅https://metacpan.org/pod/Module::Build#INSTALL-PATHS

当文档谈到$Config{foo}%Config时,它表示the Config module提供的%Config变量。还可以通过运行$Config{foo}来检查perl -V:foo的值。

(如果你认为这似乎不必要地复杂,那你就是对的。)

简短版本是perl有多个“系统目录”,其中一个用于“特定于站点”的模块,因此用作默认安装目标。你是对的,这是一个单独的目录(每个perl安装),它与多用户系统不能很好地融合:它在所有用户之间共享,你需要root权限来安装模块(这样做可能会升级/从系统包中覆盖模块,这是一个坏主意。)

人们做的是将ExtUtils :: MakeMaker,Module :: Build等配置为安装到用户的主目录中。这可以通过环境变量来完成。然后他们告诉perl将此目录添加到@INC,因此实际上可以找到并加载模块。这是通过另一个环境变量PERL5LIB完成的。 (PERL5LIB不影响安装,它纯粹用于加载。)

以上所有内容都是自动化的,并封装在local::lib中。 (local :: lib也可用于创建每个项目的模块子目录。)

CPAN文件还说:

  

从CPAN 1.9463开始,如果您没有权限编写默认的perl库目录,CPAN的配置过程将询问您是否要引导local::lib,这样可以轻松保存个人perl库目录。 / p>

您可以通过在主目录中安装私有perl来回避整个问题(在这种情况下,“system”目录只是$HOME下的另一个子目录,因此不会与任何人共享并且可以编写由你)。这很容易,例如perlbrew

另一个注意事项:您刚刚在PERL5LIB的文档中发现了一个错误。 “和当前目录”已过时:出于安全原因,.已从默认的模块位置列表中删除。

答案 2 :(得分:0)

这是一个复杂的问题。您可以通过寻找其中一个库来确定 core 库的位置:

perldoc -l B

将告诉您B核心模块的位置。你可以尝试其他不同结果的人......

此外,perl -V会告诉您所有重要的shell变量以及@INC的值,它是查找库的位置。

核心库通常位于与本地库不同的位置。此外,如果您使用 perlbrew local::lib,您可能需要考虑更多事项。关于shell变量以及PERL5LIB,您还有PERL_LOCAL_LIB_ROOT

关于您的其他问题,我会说root可能会在系统范围内安装库。任何用户都可以通过shell变量或其他方式(如命令行选项perl -I <lib location>)或在use lib <lib location>;等代码中包含这些地方,然后包含任何本地地点。

还有perlbrewlocal::lib一起允许非特权用户在本地目录中安装 Perl 和库。

关于从CPAN安装模块的方法,我最喜欢的是cpanminus。它是使用cpanm <library to install>调用的。它永远不会失败......