如果我理解模块最终出现在@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
这么多目录的原因是什么,以及在哪里。
答案 0 :(得分:7)
请参阅Debian's Perl Policy on paths,了解除第一个和最后一个之外的所有内容的基本原理和用法。我猜测/etc/perl
将用于仅包含配置数据的模块,而/usr/local/lib/site_perl
用于共享非架构相关的非版本相关模块和非Debian打包的Perl?< / p>
答案 1 :(得分:4)
基于这些目录中的文件以及我对Perl的了解,我会说它们会像这样分解:
/etc/perl
- 一些Perl模块写出配置文件。其中两个例子是CPAN
和libnet分布中的模块。基于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::MakeMaker或Module::Build中阅读这些目录:
如果您使用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
这很方便,特别是当模块多次安装到不同的位置时。