Как я могу найти версию установленного модуля Perl? - PullRequest
55 голосов
/ 26 сентября 2008

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

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

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

Ответы [ 12 ]

58 голосов
/ 26 сентября 2008

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

У меня это встроено в 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 (заглавная 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, чтобы создать автобандл.

56 голосов
/ 26 сентября 2008

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

perl -MSome::Module -le 'print $Some::Module::VERSION'
33 голосов
/ 26 сентября 2008

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

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

perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module
21 голосов
/ 26 сентября 2008

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

(Аккуратный трюк, который я узнал от Мэтта Траута.)

8 голосов
/ 26 сентября 2008

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

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

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

6 голосов
/ 26 сентября 2008

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

function perlmodver {
    perl -M$1 -e 'print $ARGV[0]->VERSION . "\n"' $1
} 
3 голосов
/ 26 сентября 2008

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

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

2 голосов
/ 20 ноября 2017

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

perl -e 'use Search::Elasticsearch; print $Search::Elasticsearch::VERSION;'
2 голосов
/ 26 сентября 2008

Я написал небольшой скрипт, чтобы сообщить, что: 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
1 голос
/ 24 февраля 2014

У нас есть системный perl (/ usr / bin / 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";

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...