2008-09-25 3 views
48

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

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

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

Смотрите также http://stackoverflow.com/questions/ 1920045/how-can-i-get-the-version-and-location-of-an-install-perl-module – Ether 2009-12-29 01:02:22

ответ

52

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

Я это встроено в 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) 
     [email protected] 

Если вы хотите увидеть все неприменяющиеся модулей, используйте -O (капитальное 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.

50

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

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

Это лучший способ – dns 2013-05-05 16:01:29

+3

, это не абстрагируется для работы с любым модулем. не правильный ответ. – 2014-02-17 18:49:29

+3

Это работает. Однако в Windows он должен процитировать по-другому для его работы (пример для [File :: Fetch] (http://perldoc.perl.org/File/Fetch.html)): `perl -MFile :: Fetch -le" print $ File :: Fetch :: VERSION "` - двойные кавычки вместо одиночных кавычек (в противном случае появляется сообщение об ошибке: «Невозможно найти ограничитель строк» ​​«где угодно до EOF на -e строке 1.») – 2015-04-16 20:16:58

8

Если вам повезет, то модуль будет иметь переменная пакет с именем $ VERSION:

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

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

+0

Это действительно не требуется для модулей, которые будут распространяться в CPAN. Многие дистрибутивы смотрят на эту переменную, чтобы объявить версию, но только основной модуль в дистрибутиве должен это сделать. Посмотрите на любой из модулей в Mojolicious, которые, например, не Mojolicuous.pm. – 2016-11-03 00:53:32

2

Я написал небольшой сценарий, чтобы сообщить, что: 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 
0

Кроме того, для модулей, которые используют 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 ... 
16

Там является менее типирование трюк, который работает при условии ваш модуль не имеет что-то безумное, как метку времени 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. 

(ловкий трюк я узнал от Matt Траут.)

+0

Я тоже использую это на века. Не мог вспомнить, откуда я его взял, но, скорее всего, я получил его с того же места. – rjray 2008-09-26 02:50:03

28

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

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

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

Отъезд pmtools скрипты на CPAN. Если вы используете дистрибутив Debian (на основе), есть также удобный pmtools package. Сюда входит скрипт «pmvers», который сообщает вам версию модуля. Это очень удобно.

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

5

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

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

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

} 
0

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

$ module-version 

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

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

perl -e 'use Search::Elasticsearch; print $Search::Elasticsearch::VERSION;' 
Смежные вопросы