【问题标题】:What are the various directories in @INC used for?@INC 中的各种目录是做什么用的?
【发布时间】:2009-10-21 17:51:35
【问题描述】:

如果我了解模块最终出现在@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

目录这么多的原因是什么,去哪里了。

【问题讨论】:

    标签: perl


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      根据这些目录中的文件,以及我对 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 当问题专门询问 Debian Perl 软件包并提到 ActiveState 的版本不同时,您为什么觉得有必要说明这一点?这显然只是 Debian。甚至我的回答也提到了 Debian。
      • 您提到了 debian,但并不明显这只是 debian 而不是 Windows 与 Linux 的事情。事实上,好的答案并不认为任何事情都是显而易见的:)
      【解决方案3】:

      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 中了解它们:

      • core - 用于 Perl 附带的东西
      • site - 本地用户安装的东西
      • vendor - 操作系统供应商为您或通过他们的软件包系统安装的东西

      大多数情况下,如果您使用 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
      

      【讨论】:

        【解决方案4】:

        您可能还会发现 Schwern 最近在 core/vendor/site 上的 Use.perl journal entry 对一些背景很有帮助。

        【讨论】:

          【解决方案5】:

          我认为这是因为您可以通过多种方式安装模块——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
          

          这很方便,尤其是在将模块多次安装到不同位置时。

          【讨论】:

            猜你喜欢
            • 2011-12-16
            • 1970-01-01
            • 2021-09-14
            • 2021-01-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-07
            • 2010-09-13
            相关资源
            最近更新 更多