我找不到CPAN安装文件的权威/全面描述.我假设必须有一组规则并且它不像"XYZ目录"那么简单,因为,例如,Linux盒子上的多个用户可以运行CPAN,即使有一个Perl安装并且它仍然以某种方式工作.那么,那些规则是什么?
这个问题的第二部分:PERL5LIB环境变量的文档说它是"在查看标准库和当前目录之前查找Perl库文件的目录列表."
我假设CPAN没有安装到标准库位置,因为可能是针对特定Perl版本修复的.那么CPAN可能会安装到PERL5LIB中吗?
最后,正如我已经提到的,CPAN如何处理多个用户可能正在运行相同的Perl安装的事实?对不起,如果这是一个单独的问题,但似乎可能相关.
ike*_*ami 10
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
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法获取任何这些位置的路径:
perl -V:{var}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法获取这些位置的所有路径:
perl -V:'install.*'
Run Code Online (Sandbox Code Playgroud)
这些是安装程序[1]使用的默认值.但是,两个最常用的安装程序允许用户进行安装以覆盖任何和所有这些.如果模块安装在非标准位置,PERL5LIB
可以用来perl
知道在哪里找到模块.
CPAN不安装模块.这是一个存储库.
cpan
不安装模块.cpan
从CPAN下载发行版并运行其中提供的安装程序,Makefile.PL
和Build.PL
.(同去的cpanm
和cpanp
.)
这些脚本大多使用ExtUtils :: MakeMaker或Module :: Build自行安装(尽管存在其他安装程序).
CPAN 实际上并不安装文件。它运行嵌入在每个发行版中的安装脚本,然后执行实际安装。
对于使用分布的ExtUtils :: MakeMaker的,默认值是记录在这里:https://metacpan.org/pod/ExtUtils::MakeMaker#make-install(和默认值INSTALLDIRS
是site
)。对于Module::Build,请参阅https://metacpan.org/pod/Module::Build#INSTALL-PATHS。
当文档谈到$Config{foo}
or 时%Config
,它表示Config 模块%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 的配置过程会询问您是否要 bootstrap
local::lib
,这使得保持个人 perl 库目录变得容易。
您可以通过在您的主目录中安装一个私有 perl 来回避整个问题(在这种情况下,“系统”目录只是您下的另一个子目录$HOME
,因此不会与任何人共享,您可以写入)。这对于例如perlbrew非常容易。
另一个注意事项:您刚刚在PERL5LIB
. “和当前目录”已过时:.
出于安全原因已从模块位置的默认列表中删除。