【问题标题】:How can I find the version of an installed Perl module?如何找到已安装的 Perl 模块的版本?
【发布时间】:2010-09-13 05:45:58
【问题描述】:

如何找到已安装 Perl 模块的版本?

这是在底部的答案中,但我认为住在这里足够重要。有了这些建议,我在 .bashrc 中创建了一个函数

function perlmodver {
    perl -M$1 -e 'print "Version " . $ARGV[0]->VERSION . " of " . $ARGV[0] . \
    " is installed.\n"' $1
}

【问题讨论】:

标签: perl module version cpan


【解决方案1】:

大多数模块(尤其是来自 CPAN 的模块)都有一个 $VERSION 变量:

perl -MSome::Module -le 'print $Some::Module::VERSION'

【讨论】:

  • 这没有被抽象为与任何模块一起工作。答案不对。
  • 这行得通。但是,在 Windows 上,它应该以不同的方式引用它才能工作(例如 File::Fetch):perl -MFile::Fetch -le "print $File::Fetch::VERSION" - 双引号而不是单引号(否则,错误消息是结果:“找不到字符串终止符”'“ -e 第 1 行 EOF 之前的任何位置。")
【解决方案2】:

如果幸运的话,该模块将有一个名为 $VERSION 的包变量:

$ perl -MCPAN -e 'print "$CPAN::VERSION\n"'
1.9205

这是在 CPAN 上分发模块所必需的,但内部开发的模块可能遵循不同的约定或根本不遵循。

【讨论】:

  • 在 CPAN 上分发模块实际上不需要这样做。许多发行版查看该变量来声明版本,但只有发行版中的主模块需要这样做。例如,查看 Mojolicious 中任何不是 Mojolicuous.pm 的模块。
【解决方案3】:

我写了一个小脚本来报告:perlver

这是一个简单的小工具 告诉你什么版本的模块 已安装,.pm 文件在哪里 位于。它还确保了模块 可以成功加载。它 自动转换“-”、“/”或 ‘\’ 到 ‘::’,所以你可以使用路径名 或发行版名称而不是 规范的模块名称。

它假定模块定义了一个 $VERSION。如果模块没有定义 $VERSION,它仍然会告诉你 .pm 文件在哪里,所以你可以手动检查它。您也可以一次检查多个模块:

$ perlver CPAN DBD-Pg Getopt::Long
CPAN 1.7602 is
 /usr/lib/perl5/5.8.8/CPAN.pm
DBD::Pg 1.49 is
 /usr/lib/perl5/vendor_perl/5.8.8/i686-linux/DBD/Pg.pm
Getopt::Long 2.36 is
 /usr/lib/perl5/vendor_perl/5.8.8/Getopt/Long.pm

【讨论】:

    【解决方案4】:

    此外,对于使用 Exporter.pm 的模块,您可以通过以下技巧获取此信息:

    perl -MSome::Module=99999 -ex
    Some::Module version 99999 required--this is only version 1.9205 at ...
    

    对于不使用 Exporter.pm 的模块,稍长的技巧会报告相同的信息:

    perl -e'use Some::Module 99999'
    Some::Module version 99999 required--this is only version 1.9205 at ...
    

    【讨论】:

      【解决方案5】:

      有一个少打字的技巧,只要你的模块没有像 Unix 时间戳这样的疯狂的东西作为版本号,它就可以工作。

      perl -MFoo::Bar\ 9999
      

      这行得通,因为它翻译成是

      use Foo::Bar 9999;
      

      即至少为 9999 或更高版本的 Foo::Bar 版本。 你得到的是

      Foo::Bar version 9999 required--this is only version 1.1.
      BEGIN failed--compilation aborted.
      

      (我从马特·特劳特那里学到的绝招。)

      【讨论】:

      • 我也已经使用这个很久了。不记得我是从哪里捡来的,但很可能是从同一个地方得到的。
      • Windows 命令提示的小改动(无论出于何种原因):perl -M"Foo::bar 9999"
      • @igelkott:这确实适用于File::Fetchperl -M"File::Fetch 9999"(64 位 Perl 5.18)。输出:File::Fetch version 9999 required--this is only version 0.46.。但是,第二行“BEGIN failed--compilation aborted.”乍一看令人困惑(在答案中列出)。
      【解决方案6】:

      您为什么要尝试获取模块的版本?您是在程序中需要这个,您只是需要将数字传递给另一个操作,还是只是想找出您拥有什么?

      我在cpan(perl 附带)中内置了这个,带有-D 开关,因此您可以在 CPAN 上查看您已安装的版本和当前版本:

      $ cpan -D 文本::CSV_XS 文本::CSV_XS -------------------------------------------------- ---------------------- Text::CSV 的快速 8 位干净版本 H/HM/HMBRAND/文本-CSV_XS-0.54.tgz /usr/local/lib/perl5/site_perl/5.8.8/darwin-2level/Text/CSV_XS.pm 安装:0.32 CPAN:0.54 不是最新的 H.Merijn 品牌 (HMBRAND) h.m.brand@xs4all.nl

      如果您想查看所有过时的模块,请使用-O(大写 O)开关:

      $ cpan -O 模块名称 本地 CPAN -------------------------------------------------- ---------------------- 阿帕奇::数据库 0.1300 0.1400 阿帕奇::SOAP 0.0000 0.7100 阿帕奇::会话 1.8300 1.8700 Apache::SizeLimit 0.0300 0.9100 Apache::XMLRPC::Lite 0.0000 0.7100 ... 等等

      如果您想查看已安装的所有模块的信息,请尝试使用-a 开关来创建自动捆绑包。

      【讨论】:

      • (我知道这是一个旧答案!)我尝试了 -D 和 -O 并且 cpan 不理解这些选项。手册页显示了选项,但 perldoc 没有。什么给了?
      【解决方案7】:

      VERSION 是所有 Perl 类的UNIVERSAL 方法。您可以使用它来获取模块版本(如果已设置它通常具有的)。

      这是一个单行,您只需添加一次模块名称:

      perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module
      

      【讨论】:

      • 完美答案。
      【解决方案8】:

      查看 CPAN 上的 pmtools 脚本。如果您使用的是 Debian(-based) 发行版,还有一个方便的 pmtools package。这包括一个脚本“pmvers”,它告诉您模块的版本。这很方便。

      它的功能类似于人们发布的各种单行代码,但它在错误处理方面更聪明一些,并且可以一次为您提供多个模块的版本。

      【讨论】:

        【解决方案9】:

        感谢您的回答!我在我的 .bashrc 中创建了一个函数来轻松找到 Perl 模块的版本:

        function perlmodver {
            perl -M$1 -e 'print $ARGV[0]->VERSION . "\n"' $1
        } 
        

        【讨论】:

          【解决方案10】:

          我们在 Solaris 10 中有系统 perl (/usr/bin/perl),上面的解决方案是没用的。其中一些报告“未安装module.pm”,其中一些没有输出。

          这是有用的代码,它可以列出所有模块及其版本。

          #!/usr/bin/perl
          
          use strict;
          use ExtUtils::Installed;
          
          my @modules;
          my $installed = ExtUtils::Installed->new();
          
          if (scalar(@ARGV) > 0) {
          
              @modules = @ARGV;
          
          } else {
          
              @modules = $installed->modules();
          
          }
          
          print "Module\tVersion\n";
          
          foreach (@modules) {
          
              print $_ . "\t" . $installed->version($_) . "\n";
          
          }
          

          【讨论】:

            【解决方案11】:

            你也可以看看App::module::version

            $ module-version
            
            The version of App::module::version in /home/yourself/perl5/lib/perl5 is 1.004
            

            【讨论】:

              【解决方案12】:

              对我来说最容易记住和最强大的版本:

              perl -e 'use Search::Elasticsearch; print $Search::Elasticsearch::VERSION;'
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-03-05
                • 2010-12-27
                • 2014-01-03
                • 1970-01-01
                • 2015-05-20
                • 2021-03-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多