【问题标题】:What modules are distributed with Perl?Perl 分发了哪些模块?
【发布时间】:2009-02-20 23:30:18
【问题描述】:

我如何知道 Perl 分发了哪些模块?

我的第一个猜测是here 列出的核心模块总是包含在内,尽管我找不到明确说明。但是,我使用了这个集合之外的模块(例如 LWP),而无需在 Mac OS X 和 Linux 上安装它们。

所以稍微完善一下我的问题:

  • 所有 Perl 安装都分发了哪些模块?

还有:我如何找出已分发的模块:

  • Linux(尤其是 Debian/Ubuntu)?

  • Mac OS X?

  • Solaris?

在每种情况下,我都使用最新版本的操作系统标配的 Perl 版本。

TIA。

更新: 问题的原因是我正在 Mac OS X 和 Linux 上进行开发以部署到不同的 Linux 和 Solaris,并且我在其中一些系统上没有 root,并且在 Mac OS X 的情况下,我什至没有编译器 AFAIK。所以我想知道哪些模块可以在所有四个部署中使用而无需进一步安装。

【问题讨论】:

    标签: perl module


    【解决方案1】:

    如果你安装了Module::CoreList,命令行程序corelist可以告诉你所有关于模块及其在不同版本perl中的版本的信息。您链接到的页面概述了最新版本的 perl。

    请注意,默认情况下,发行版通常提供比此列表更多的功能,但可以假定此列表无处不在(除非它明确是依赖于操作系统的模块,例如 Win32)。

    【讨论】:

    • 虽然这应该是正确的答案,但实际上供应商在构建 Perl 时会做一些古怪的事情。我们需要像 Module::CoreList::Debian 这样的模块 :)
    【解决方案2】:

    已经给出了正确的直截了当的答案,但我认为你问错了问题。您可能正在尝试仅使用核心模块进行开发。为什么?您这样做可能是因为您不想处理依赖关系。为什么?因为他们可能会让人头疼。但是在没有CPAN 的情况下开发 Perl 会失去一半的力量。你在折磨自己。这是值得的。

    更新: 既然我对你想要做的事情有了更多的了解,我就可以回答正确的问题了。首先是“当我没有 root 时如何安装模块?”简单的答案是这样的:

    perl Makefile.PL PREFIX=/some/path LIB=/some/path/lib
    ...and all the rest as normal...
    

    对于基于 MakeMaker 的模块(LIB 用于控制 PREFIX 的不精确性质。首选 INSTALL_BASE,但它不向后兼容)。

    这用于 Module::Build

    perl Build.PL --install_base=/some/path
    

    然后模块将在 /some/path/lib 中结束,您可以在代码中设置 PERL5LIB 环境变量或 use lib qw(/some/path/lib)

    这意味着您可以将依赖模块直接粘贴到您的软件发行版中并发布它们。适用于纯 Perl 模块。对于需要编译器的内容,请查看 PAR,因为其他人建议能够发布已编译的可执行文件。

    或者,您可以将您的内容作为 CPAN 模块分发,并附上依赖项,然后让 CPAN 客户端解决它们。您甚至可以使用Module::AutoInstall 在 CPAN 客户端之外执行此过程。

    所以你看,在发布 Perl 应用程序时,你并不局限于只使用核心模块。

    【讨论】:

    • 我会为这个问题添加更多细节。
    • 谢谢,我真的很想避免安装任何模块,即使是在本地,如果我能提供帮助的话,因为考虑到平台的混合和其中一个缺乏编译器(和我没有太多时间做这项工作)。所以我真的很想使用已安装的和/或纯 perl。
    • 虚假经济。 CPAN 模块非常便携,而您只是在使用 Unixen!有很多纯 Perl。您将花费更多时间重新发明轮子,然后弄清楚如何安装模块。您将需要 CPAN 模块用于您的下一个项目,学习它是一项投资。
    • 对于 Schwern 的更新答案,perlfaq8 中有更多信息 :)
    • 至于节省时间,重用已知的、经过测试的代码是最大的节省时间。
    【解决方案3】:

    Module::CoreList 已经被提及。它带有command-line interface,让事情变得简单。如果您已经安装了它,或者有一个程序需要弄清楚特定版本的 Perl 可能没有附带什么,那就太好了。

    如果您想知道特定版本的 perl 附带了哪些模块,可以在命令行上运行 perldoc perlmodlib 以获取完整列表。对于较旧或较新版本的 Perl,您只需转到 Perl's page on the CPAN 并从下拉列表中选择您想要的版本(例如,5.6.2),然后导航到文档中的 perlmodlib 页面。 (在浏览器的文本搜索中输入 perlmodlib 会有所帮助)。

    如果你想使用一个模块,因为它不是旧版本 Perl 的核心,那么你可能希望考虑使用 PAR, the Perl Archiver 来捆绑你的额外依赖项,甚至Perl 本身! Perl Training Australia 也有一个Perl Tip on using PAR,其中涵盖了 PAR 入门的基础知识。

    一切顺利,

    保罗

    【讨论】:

      【解决方案4】:

      要快速查看已安装的模块和版本,请使用 cpan 工具创建自动捆绑包:

       cpan -a
      

      如果您需要更复杂的东西,ExtUtils::Installed 可以为您提供帮助。

      曾经有“标准库”的想法,但实际上并不存在。 Module::CoreList 告诉您“标准库”中有什么,但许多供应商安装了额外的模块,有些甚至删除或更新了模块。此外,Strawberry PerlActivePerl 等发行版附带许多奖励模块。

      另外,您不需要 root 来安装模块。您只需要 root 即可安装模块,而 root 可以安装模块。 perlfaq8 为您提供了在任何您喜欢的地方安装模块的所有详细信息。我建议您将所有模块安装在分布式 @INC 目录之外,以保持分布式 Perl 干净。

      祝你好运,

      【讨论】:

      • 我没有使用 cpan -a (请参阅我自己的答案在下面被修改为我实际使用的黑客)如果你在一个月前回复了我会的,所以我将其标记为正确答案!谢谢。我确信一定有办法,这将是未来有用的信息。
      【解决方案5】:

      听起来你想要local::lib。没有 root 的 cpan 的所有好处(并且使系统 perl 保持不变)。

      【讨论】:

        【解决方案6】:

        这方面的一个简单参考在书中的Appendix D Beginning Perl。当然它适用于 Perl 5.6,但据我所知,Perl 5.8 没有删除任何这些,只是引入了新的(如 Digest::MD5、File::Temp、Filter::Simple、libnet、List::Util、Memoize , MIME::Base64, Scalar::Util, Storable, Switch, Test::More, Test::Simple, Text::Balanced, Tie::File等)

        对于 perl 的每个版本,您可以查看 perldoc。这是list for perl 5.8.8

        【讨论】:

          【解决方案7】:

          这个问题现在不那么重要了(我在最终的目标机器上拥有 root 访问权限,所以我只需要安装我需要的包)但是如果有人感兴趣,这就是我所做的:

          首先,在每个目标系统上运行此代码:

          foreach my $dir (@INC) {
              print "Directory: $dir\n";
              if (-d "$dir") {
                  my @modules = `find $dir/ -name "*.pm"`;
                  foreach my $m (@modules) {
                      my $label = $m;
                      $label =~ s|\n$||;
                      $label =~ s|//+|/|g;
                      $label =~ s|^$dir/||;
                      print "$label\n";
                  }
              }
          }
          

          请注意,您需要一个带有 find 命令的 *nix 系统。将输出转储到三个文件中,并排序。然后使用这样的命令(从内存中):

          grep -F -x -f list-1.txt list2.txt > list-12.txt
          grep -F -x -f list-12.txt list3.txt > list-123.txt
          

          现在 list-123.txt 应该有共享模块的列表,或多或少。

          不管怎样,这三个系统都共享了一些额外的模块,尤其是 XML::Parser 模块。

          【讨论】:

          • 它获取了在各个机器之间共享的模块列表,但它没有说明 Perl 附带了什么。操作系统供应商添加了更多模块。系统管理员从包和 CPAN 安装更多。你可以在某种程度上解开这个问题。查看“perl”和“vendor”lib 目录。但它太不值得了。
          • 以 root 身份安装模块无论如何都不是一个好主意。除非您真的想为系统的多个用户共享这些模块。对于单个用户,在主目录下的目录中本地安装模块通常就足够且更安全,因为它不会损坏由系统打包管理的文件。
          【解决方案8】:

          查看主符号表,它会显示所有可用的“标准”包...

          print %main::;
          

          【讨论】:

          • 显示所有分发的模块,只显示那些已经编译的模块。它还显示了各种其他的东西。
          猜你喜欢
          • 2017-12-18
          • 2018-10-06
          • 1970-01-01
          • 2011-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-14
          • 1970-01-01
          相关资源
          最近更新 更多