Как я могу найти версию установленного модуля Perl?

Как вы находите версию установленного модуля Perl?

это в ответе внизу, но я считаю, что это достаточно важно, чтобы жить здесь. С помощью этих предложений я создаю функцию в my .bashrc

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

12 ответов


почему вы пытаетесь получить версию модуля? Вам нужно это из программы, вам просто нужен номер, чтобы перейти к другой операции, или вы просто пытаетесь узнать, что у вас есть?

у меня это встроено в cpan (который поставляется с perl) с -D переключатель, так что вы можете увидеть версию, которую вы установили и текущую версию на CPAN:

$ cpan -D Text::CSV_XS

Text::CSV_XS
-------------------------------------------------------------------------
        Fast 8bit clean version of Text::CSV
        H/HM/HMBRAND/Text-CSV_XS-0.54.tgz
        /usr/local/lib/perl5/site_perl/5.8.8/darwin-2level/Text/CSV_XS.pm
        Installed: 0.32
        CPAN:      0.54  Not up to date
        H.Merijn Brand (HMBRAND)
        h.m.brand@xs4all.nl

если вы хотите увидеть все устаревшие модули, используйте -O (буква О) переключатель:

$ cpan -O
Module Name                                Local    CPAN
-------------------------------------------------------------------------
Apache::DB                                0.1300  0.1400
Apache::SOAP                              0.0000  0.7100
Apache::Session                           1.8300  1.8700
Apache::SizeLimit                         0.0300  0.9100
Apache::XMLRPC::Lite                      0.0000  0.7100
... and so on

если вы хотите увидеть это для всех установленных модулей, попробуйте -a переключатель для создания autobundle.


большинство модулей (особенно из CPAN) имеют переменную $VERSION:

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

версия универсальная метод всех классов Perl. Вы можете использовать его для получения версии модуля (если он был установлен, который он обычно имеет).

вот один лайнер, где вам нужно только добавить имя модуля один раз:

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

есть трюк с меньшим набором текста, который работает при условии, что ваш модуль не имеет чего-то безумного, как временная метка Unix в качестве номера версии.

perl -MFoo::Bar\ 9999

это работает, потому что это переводится как

use Foo::Bar 9999;

т. е. версия Foo:: Bar, которая по крайней мере версия 9999 или новее. И что вы получаете

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

(ловкий трюк я узнал от Мэтта форель.)


Если Вам ПОВЕЗЕТ, модуль будет иметь переменную пакета с именем $VERSION:

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

это необходимо для модулей, которые будут распространяться на CPAN, но внутренне разработанные модули могут следовать другому соглашению или вообще не следовать.


Спасибо за ответы! Я создал функцию в своем .bashrc, чтобы легко найти версию модуля Perl:

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

Проверьте pmtools скрипты на CPAN. Если вы используете дистрибутив Debian (на основе), есть также удобный pmtools пакета. Это включает в себя скрипт "pmvers", который сообщает вам версию модуля. Это очень удобно.

Он делает что-то похожее на различные однострочные люди, опубликованные, но это немного умнее об обработке ошибок, и может дать вам версию более одного модуля сразу.


Я написал небольшой скрипт, чтобы сообщить, что: perlver.

Это простой маленький инструмент, который говорит вам, какая версия модуля вы установили, и где то .файл pm размещенный. Он также обеспечивает модуль может быть загружен успешно. Он автоматически преобразует ‘-’, ‘/’, или '\'to'::’, поэтому вы можете использовать путь или имя дистрибутива вместо каноническое имя модуля.

предполагается, что модуль определяет $ВЕРСИЯ. Если модуль не определяет $VERSION, он все равно скажет вам, где , Так что вы можете проверить его вручную. Вы также можете проверить сразу несколько модулей:

$ 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

у нас есть система perl (/usr/bin/perl) в Solaris 10, и вышеуказанные решения бесполезны. Некоторые из них сообщают " модуль.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";

}

самый простой для запоминания и самый надежный вариант для меня:

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

кроме того, для модулей, использующих экспортер.pm, вы можете получить эту информацию с помощью этого трюка:

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

для модулей, которые не используют экспортер.pm, немного более длинный трюк сообщает ту же информацию:

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

вы также можете посмотреть App:: module:: version

$ module-version

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