@INC 中的各个目录有什么作用?

5

如果我了解模块为什么会出现在@INC下的不同目录中,那么你能帮助我确定我拥有哪个模块。

在Windows上的ActiveState中,这相当清晰明了。

C:/Perl/lib
C:/Perl/site/lib

第一个部分是核心Perl内容,而第二个部分是我通过PPM安装的内容(我理解得对吗?)

然而,在Debian下似乎更加复杂。

/etc/perl
/usr/local/lib/perl/5.8.4
/usr/local/share/perl/5.8.4
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8
/usr/share/perl/5.8
/usr/local/lib/site_perl

许多目录的原因是什么,每个目录应该存放哪些内容。
5个回答

7

请参考Debian关于路径的Perl策略,了解除第一个和最后一个之外的所有路径的理由和用途。我猜/etc/perl是为仅包含配置数据的模块而设置的,而/usr/local/lib/site_perl则用于与非Debian打包的Perl共享非架构相关、非版本相关的模块。


4
Perl并不在意这个问题,而Debian的做法是基于他们自己独特的做事方式。这完全取决于配置和安装Perl的人。例如,我将所有perl的内容都放在它们自己的目录下,因为我安装了很多版本。
/usr/local/perls/perl-5.10.0/lib/perl5/darwin-2level
/usr/local/perls/perl-5.10.0/lib/perl5
/usr/local/perls/perl-5.10.0/lib/5.10.0/darwin-2level
/usr/local/perls/perl-5.10.0/lib/5.10.0
/usr/local/perls/perl-5.10.0/lib/site_perl/5.10.0/darwin-2level
/usr/local/perls/perl-5.10.0/lib/site_perl/5.10.0
.

Perl构建系统识别可能有三种安装目录,你可以在ExtUtils::MakeMakerModule::Build中了解到这些信息:
  • core - Perl自带的内容
  • site - 本地用户安装的内容
  • vendor - 操作系统供应商为您安装的内容或通过他们的软件包系统安装的内容
如果您使用CPAN工具安装自己的内容,则大多数情况下不必担心此问题,因为它们将为您将内容放入site目录中。但是,某些Perl模块分发可能会更改构建系统设置以安装到core或vendor目录中。
Debian有他们自己的政策,我认为有点复杂,但对他们有效。
ActiveState的系统真正被设置为一个大部分由ActiveState管理的解决方案,所以你需要通过PPM安装所有内容。他们主要关注稳定和经过测试的企业安装,在这种情况下,他们为您处理大部分事情。如果你想自己完成所有的工作,你可以使用Strawberry Perl,它也有一个简单的模块目录布局。
我不使用苹果的Perl来做我的事情,但是他们的设置也很奇怪:
/System/Library/Perl/5.8.8/darwin-thread-multi-2level
/System/Library/Perl/5.8.8
/Library/Perl/5.8.8/darwin-thread-multi-2level
/Library/Perl/5.8.8
/Library/Perl
/Network/Library/Perl/5.8.8/darwin-thread-multi-2level
/Network/Library/Perl/5.8.8
/Network/Library/Perl
/System/Library/Perl/Extras/5.8.8/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.8.8
/Library/Perl/5.8.6
/Library/Perl/5.8.1

4
基于这些目录中的文件和我的Perl知识,我会按照以下方式划分:
  • /etc/perl - 一些Perl模块会写出配置文件。其中两个例子是CPANlibnet分发包中的模块。Debian系统将这些配置文件存储在此处。
  • /usr/local/lib/perl/5.8.4 - 这是安装在软件包系统之外的特定平台文件所在的位置。
  • /usr/local/share/perl/5.8.4 - 这是安装在软件包系统之外的无平台文件所在的位置。
  • /usr/lib/perl5 - 这是由软件包系统安装的特定平台文件所在的位置。
  • /usr/share/perl5 - 这是由软件包系统安装的无平台文件所在的位置。
  • /usr/lib/perl/5.8 - 这些是核心部分的特定平台文件。
  • /usr/share/perl/5.8 - 这些是核心部分的无平台文件。
  • /usr/local/lib/site_perl - 这是您可以安装自己的模块的位置(如果它们没有CPAN风格的安装程序的话,但它们真的应该有)。

仅适用于Debian。这不是Perl的问题。 - brian d foy
@brian d foy,您为什么觉得有必要在问题明确询问Debian Perl软件包且提到ActiveState版本不同的情况下进行说明呢?这显然只涉及到Debian。即使是我的回答也提到了Debian。 - Chas. Owens
你提到了Debian,但它并不明显是仅限于Debian而不是Windows与Linux之间的问题。事实上,好的答案不会假设任何东西是显而易见的 :) - brian d foy

3

你可能会发现Schwern最近在Use.perl日志中关于核心/供应商/站点的一些背景信息很有帮助。


1

我认为这是因为安装模块的方式有很多种——cpan、tar.gz、deb包——它们都试图不干扰其他人的东西。

在搜索模块时,%INC非常方便。它存储所有模块的名称和位置,以及它们被加载的位置。

例如,运行以下命令:

perl -MDBI -e 'print join "\n", map { $_ . " = " . $INC{$_} } keys %INC'

给我:

XSLoader.pm = /usr/lib/perl/5.10/XSLoader.pm
warnings/register.pm = /usr/share/perl/5.10/warnings/register.pm
Carp.pm = /usr/share/perl/5.10/Carp.pm
Scalar/Util.pm = /usr/lib/perl/5.10/Scalar/Util.pm
Exporter/Heavy.pm = /usr/share/perl/5.10/Exporter/Heavy.pm
vars.pm = /usr/share/perl/5.10/vars.pm
strict.pm = /usr/share/perl/5.10/strict.pm
Exporter.pm = /usr/share/perl/5.10/Exporter.pm
List/Util.pm = /usr/lib/perl/5.10/List/Util.pm
warnings.pm = /usr/share/perl/5.10/warnings.pm
DBI.pm = /usr/lib/perl5/DBI.pm
AutoLoader.pm = /usr/share/perl/5.10/AutoLoader.pm
Config.pm = /usr/lib/perl/5.10/Config.pm
DynaLoader.pm = /usr/lib/perl/5.10/DynaLoader.pm

这在模块被安装到不同位置多次时特别方便。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接