@INC中的各种目录用于什么?

时间:2009-07-23 07:58:58

标签: perl

如果我理解模块最终出现在@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 个答案:

答案 0 :(得分:7)

请参阅Debian's Perl Policy on paths,了解除第一个和最后一个之外的所有内容的基本原理和用法。我猜测/etc/perl将用于仅包含配置数据的模块,而/usr/local/lib/site_perl用于共享非架构相关的非版本相关模块和非Debian打包的Perl?< / p>

答案 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样式的安装程序,他们真的应该这样做)。

答案 2 :(得分:4)

Perl并不在乎,Debian如何做到这一点是基于他们自己做的一切的特殊方式。这完全取决于配置和安装Perl的人。例如,我将所有perls保存在他们自己的目录下,因为我安装了这么多:

/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中阅读这些目录:

  • 核心 - 用于Perl附带的东西
  • site - 本地用户安装的东西
  • 供应商 - 操作系统供应商为您或通过其包装系统安装的东西

如果您使用CPAN工具安装自己的东西,大多数情况下您不必担心这个问题,因为他们会将内容放入网站目录中。但是,某些Perl模块发行版可能会破坏构建系统设置以安装到核心或供应商目录中。

Debian有他们的own policy,我认为这有点复杂,但它适用于他们。

ActiveState的系统实际上是一个主要由ActiveState管理的解决方案,因此您可以通过PPM安装所有内容。他们主要关注稳定且经过测试的企业安装,他们为您处理大多数事情。如果你想自己做所有事情,你可以使用Strawberry Perl,它也有一个简单的模块目录布局。

我没有使用Apple的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

答案 3 :(得分:3)

您可能还会发现Schwern最近在核心/供应商/网站上Use.perl journal entry对某些背景有帮助。

答案 4 :(得分: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

这很方便,特别是当模块多次安装到不同的位置时。