2017-10-16 201 views
6

我无法找到CPAN安装其文件的权威/全面描述。我假设必须有一组规则,并且它不像“XYZ目录”那样简单,因为例如,Linux机器上的多个用户可以运行CPAN,即使只有一个Perl安装,它仍然可以工作。那么,这些规则是什么?CPAN在哪里安装模块?

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

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

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

回答

5

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自己安装(尽管存在其他安装程序)。

+0

除了CPAN-the-repository之外,还有CPAN-per-Perl模块(这是'cpan'命令使用的)。 – melpomene

+0

表是从哪里来的,还是你自己写的? – simbabque

2

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 install),它不能与多用户系统完美匹配:它在所有用户之间共享,并且你需要root权限来安装模块(并且这样做可能会升级/从系统包中覆盖模块,这是一个坏主意)。

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

以上所有内容均为自动化并封装在local::lib中。 (本地:: lib中也可以使用如创建每个项目的模块子目录)

的CPAN文件还称:

由于CPAN 1.9463,如果你没有权限写默认的perl库目录,CPAN的配置过程会问你是否要引导local::lib,这使得保持个人perl库目录容易。


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


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

+0

谢谢,这很有帮助。关于这一点:“人们做的是将ExtUtils :: MakeMaker,Module :: Build等配置为安装到用户的主目录中”Local local :: lib是否使这种冗余? – Stephen

+0

@Stephen那么,大多数人使用local :: lib来做到这一点。 :-) local :: lib只是一个自动化的方式来创建一些目录并正确设置一些环境变量。所以是的:如果你使用local :: lib(通过添加魔术线到你的'.bashrc'或等价物),你不需要手动配置任何东西。 – melpomene

1

这是一个复杂的问题。你可以告诉在那里核心库寻求其中之一的地方位于:

perldoc -l B 

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

另外,perl -V会告诉你所有的shell变量和@INC的值,它们将查找库的位置。

核心库通常是在不同的地方找到比当地库。此外,如果您使用perlbrewlocal::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>。它永远不会失败......