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

47

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

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

function perlmodver {
    perl -M$1 -e 'print "Version " . $ARGV[0]->VERSION . " of " . $ARGV[0] . \
    " is installed.\n"' $1
}
Теги:
module
version
cpan

12 ответов

50
Лучший ответ

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

У меня есть встроенный в 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 (capital 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, чтобы создать автозапуск.

  • 1
    (Я знаю, что это старый ответ!) Я попробовал -D и -O, и cpan не понял эти опции. На странице руководства отображались варианты, но perldoc - нет. Что дает?
  • 0
    У manpage и perldoc разные версии?
48

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

perl -MSome::Module -le 'print $Some::Module::VERSION'
  • 1
    Это лучший способ
  • 3
    это не абстрагировано для работы с любым модулем. не правильный ответ.
Показать ещё 1 комментарий
26

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

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

perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module
  • 0
    Спасибо, это все, что я искал :)
  • 0
    Это именно то, что мне нужно!
Показать ещё 1 комментарий
15

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

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

  • 0
    Я тоже использовал это целую вечность. Не мог вспомнить, откуда я это взял, но, скорее всего, я получил это из того же места.
  • 0
    Незначительные изменения в командной строке Windows (по любой причине): perl -M "Foo :: bar 9999"
Показать ещё 1 комментарий
8

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

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

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

  • 0
    На самом деле это не нужно для распространения модулей на CPAN. Многие дистрибутивы смотрят на эту переменную, чтобы объявить версию, но только главный модуль в дистрибутиве должен это делать. Посмотрите, например, на любые модули в Mojolicious, которые не являются Mojolicuous.pm.
4

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

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

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

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

2

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

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

Предполагается, что модуль определяет $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

Проще всего запомнить и самую надежную версию для меня:

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

У нас есть система 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";

}
0

Вы также можете взглянуть на App:: module:: version

$ module-version

The version of App::module::version in /home/yourself/perl5/lib/perl5 is 1.004
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 ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню