CPAN在哪里安装模块?
Where does CPAN install modules?
我找不到关于 CPAN 安装其文件的位置的 authoritative/comprehensive 描述。我假设必须有一套规则,它不像 "XYZ directory" 那样简单,因为,例如,Linux 框上的多个用户可以 运行 CPAN,即使只有一个 Perl 安装它仍然以某种方式起作用。那么,这些规则是什么?
这个问题的第二部分:PERL5LIB 环境变量的文档说它是 "A list of directories in which to look for Perl library files before looking in the standard library and the current directory."
我假设 CPAN 没有安装到标准库位置,因为大概这是针对特定 Perl 版本修复的。那么也许 CPAN 安装到 PERL5LIB 中?
最后,正如我已经提到的,CPAN 如何处理多个用户可能 运行 安装同一个 Perl 的事实?抱歉,如果这是一个单独的问题,但它似乎可能相关。
CPAN 实际上并不安装文件。它运行每个发行版中嵌入的安装脚本,然后执行实际安装。
对于使用 ExtUtils::MakeMaker, the defaults are documented here: https://metacpan.org/pod/ExtUtils::MakeMaker#make-install (and the default value of INSTALLDIRS
is site
). For Module::Build, see https://metacpan.org/pod/Module::Build#INSTALL-PATHS 的发行版。
文档中提到$Config{foo}
或%Config
时,指的是the Config module提供的%Config
变量。 $Config{foo}
的值也可以通过 运行 perl -V:foo
.
查看
(如果您认为这看起来过于复杂,那您是对的。)
简而言之,perl 有多个 "system directories",其中一个用于 "site specific" 模块,因此用作默认安装目标。你是对的,这是一个单一的目录(每个 perl 安装),它与多用户系统不能很好地融合:它在所有用户之间共享,你需要 root 权限来安装模块(这样做可能 upgrade/override 来自系统包的模块,这是个坏主意)。
人们所做的是配置 ExtUtils::MakeMaker、Module::Build 等以安装到用户的主目录中。这可以通过环境变量来完成。然后他们告诉 perl 将这个目录添加到 @INC
,这样就可以实际找到并加载模块。这是通过另一个环境变量 PERL5LIB
完成的。 (PERL5LIB
不影响安装,纯用于加载。)
以上所有内容都是自动化的,并封装在 local::lib 中。 (local::lib 也可用于创建每个项目的模块子目录。)
CPAN 文档还说:
As of CPAN 1.9463, if you do not have permission to write the default perl library directories, CPAN's configuration process will ask you whether you want to bootstrap local::lib
, which makes keeping a personal perl library directory easy.
您可以通过在您的主目录中安装私有 perl 来回避整个问题(在这种情况下,"system" 目录只是您 $HOME
下的另一个子目录,因此不会与任何人共享并且可以由您写信给)。这很容易,例如perlbrew.
另一条注意事项:您刚刚在 PERL5LIB
的文档中发现了一个错误。 “和当前目录”已过时:出于安全原因,.
已从模块位置的默认列表中删除。
这是一个复杂的问题。您可以通过查找其中一个库的位置来判断 core 库的位置:
perldoc -l B
会告诉你B
核心模块所在的位置。你可能会尝试其他人的不同结果...
此外,perl -V
会告诉您所有重要的 shell 变量以及 @INC
的值,它将查找库的位置。
Core 库通常位于不同于 local 库的位置。此外,如果您使用 perlbrew 和 local::lib
,您可能需要考虑更多事项。关于 shell 个变量,除了 PERL5LIB
,还有 PERL_LOCAL_LIB_ROOT
.
关于您的其他问题,我会说 root
可能会在系统范围内安装库。任何用户都将拥有这些,然后通过 shell 变量或其他方式(如命令行选项 perl -I <lib location>
)或在代码(如 use lib <lib location>;
.
中包含任何本地位置
还有 perlbrew 与 local::lib
一起允许非特权用户在本地目录中安装 Perl 和库。
关于从 CPAN 安装模块的方式,我最喜欢的是 cpanminus。它是用 cpanm <library to install>
调用的。它永远不会失败...
首先,CPAN 不安装模块。这是一个存储库。
cpan
也不安装模块。 cpan
从 CPAN 下载发行版并运行其中提供的安装程序,无论是 Makefile.PL
还是 Build.PL
。 (同样适用于 cpanm
和 cpanp
。)
这些安装脚本主要使用 ExtUtils::MakeMaker or Module::Build 来安装发行版(尽管存在其他安装程序)。
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} # Substitute `{var}` for the var name.
您可以使用以下方法获取这些位置的所有路径:
perl -V:'install.*'
这些是安装程序使用的默认设置[1]。但是,两个最常用的安装程序允许用户在安装时覆盖所有这些。如果模块安装在非标准位置,
PERL5LIB
可用于让 perl
知道在哪里可以找到模块。
PATH
可用于让系统知道在哪里可以找到捆绑程序。
MANPATH
可用于让 man
知道在哪里可以找到手册页。
我找不到关于 CPAN 安装其文件的位置的 authoritative/comprehensive 描述。我假设必须有一套规则,它不像 "XYZ directory" 那样简单,因为,例如,Linux 框上的多个用户可以 运行 CPAN,即使只有一个 Perl 安装它仍然以某种方式起作用。那么,这些规则是什么?
这个问题的第二部分:PERL5LIB 环境变量的文档说它是 "A list of directories in which to look for Perl library files before looking in the standard library and the current directory."
我假设 CPAN 没有安装到标准库位置,因为大概这是针对特定 Perl 版本修复的。那么也许 CPAN 安装到 PERL5LIB 中?
最后,正如我已经提到的,CPAN 如何处理多个用户可能 运行 安装同一个 Perl 的事实?抱歉,如果这是一个单独的问题,但它似乎可能相关。
CPAN 实际上并不安装文件。它运行每个发行版中嵌入的安装脚本,然后执行实际安装。
对于使用 ExtUtils::MakeMaker, the defaults are documented here: https://metacpan.org/pod/ExtUtils::MakeMaker#make-install (and the default value of INSTALLDIRS
is site
). For Module::Build, see https://metacpan.org/pod/Module::Build#INSTALL-PATHS 的发行版。
文档中提到$Config{foo}
或%Config
时,指的是the Config module提供的%Config
变量。 $Config{foo}
的值也可以通过 运行 perl -V:foo
.
(如果您认为这看起来过于复杂,那您是对的。)
简而言之,perl 有多个 "system directories",其中一个用于 "site specific" 模块,因此用作默认安装目标。你是对的,这是一个单一的目录(每个 perl 安装),它与多用户系统不能很好地融合:它在所有用户之间共享,你需要 root 权限来安装模块(这样做可能 upgrade/override 来自系统包的模块,这是个坏主意)。
人们所做的是配置 ExtUtils::MakeMaker、Module::Build 等以安装到用户的主目录中。这可以通过环境变量来完成。然后他们告诉 perl 将这个目录添加到 @INC
,这样就可以实际找到并加载模块。这是通过另一个环境变量 PERL5LIB
完成的。 (PERL5LIB
不影响安装,纯用于加载。)
以上所有内容都是自动化的,并封装在 local::lib 中。 (local::lib 也可用于创建每个项目的模块子目录。)
CPAN 文档还说:
As of CPAN 1.9463, if you do not have permission to write the default perl library directories, CPAN's configuration process will ask you whether you want to bootstrap
local::lib
, which makes keeping a personal perl library directory easy.
您可以通过在您的主目录中安装私有 perl 来回避整个问题(在这种情况下,"system" 目录只是您 $HOME
下的另一个子目录,因此不会与任何人共享并且可以由您写信给)。这很容易,例如perlbrew.
另一条注意事项:您刚刚在 PERL5LIB
的文档中发现了一个错误。 “和当前目录”已过时:出于安全原因,.
已从模块位置的默认列表中删除。
这是一个复杂的问题。您可以通过查找其中一个库的位置来判断 core 库的位置:
perldoc -l B
会告诉你B
核心模块所在的位置。你可能会尝试其他人的不同结果...
此外,perl -V
会告诉您所有重要的 shell 变量以及 @INC
的值,它将查找库的位置。
Core 库通常位于不同于 local 库的位置。此外,如果您使用 perlbrew 和 local::lib
,您可能需要考虑更多事项。关于 shell 个变量,除了 PERL5LIB
,还有 PERL_LOCAL_LIB_ROOT
.
关于您的其他问题,我会说 root
可能会在系统范围内安装库。任何用户都将拥有这些,然后通过 shell 变量或其他方式(如命令行选项 perl -I <lib location>
)或在代码(如 use lib <lib location>;
.
还有 perlbrew 与 local::lib
一起允许非特权用户在本地目录中安装 Perl 和库。
关于从 CPAN 安装模块的方式,我最喜欢的是 cpanminus。它是用 cpanm <library to install>
调用的。它永远不会失败...
首先,CPAN 不安装模块。这是一个存储库。
cpan
也不安装模块。 cpan
从 CPAN 下载发行版并运行其中提供的安装程序,无论是 Makefile.PL
还是 Build.PL
。 (同样适用于 cpanm
和 cpanp
。)
这些安装脚本主要使用 ExtUtils::MakeMaker or Module::Build 来安装发行版(尽管存在其他安装程序)。
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} # Substitute `{var}` for the var name.
您可以使用以下方法获取这些位置的所有路径:
perl -V:'install.*'
这些是安装程序使用的默认设置[1]。但是,两个最常用的安装程序允许用户在安装时覆盖所有这些。如果模块安装在非标准位置,
PERL5LIB
可用于让perl
知道在哪里可以找到模块。PATH
可用于让系统知道在哪里可以找到捆绑程序。MANPATH
可用于让man
知道在哪里可以找到手册页。