Как я могу получить версию и местоположение установленного модуля Perl? - PullRequest
5 голосов
/ 17 декабря 2009

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

спасибо заранее.

Ответы [ 9 ]

9 голосов
/ 17 декабря 2009

Что-то вроде:

perl -MModule -e 'print "$Module::VERSION\n"' 2>/dev/null || echo "Not installed"

сообщит вам версию данного модуля или сообщит, что он не установлен. Использование будет выглядеть так:

perl -MXML::Parser -e 'print "$XML::Parser::VERSION\n"' 2>/dev/null || echo "Not installed"

Чтобы найти путь к модулю, вы можете исследовать @INC, чтобы найти возможные местоположения, или вы можете посмотреть perlwhich . Существует также pmpath из pmtools .

5 голосов
/ 18 декабря 2009

Самое короткое, что я знаю, это не псевдоним сценария или оболочки:

$ perl -MFoo::Bar\ 99
Foo::Bar version 99 required--this is only version 1.234.

(или обычное сообщение о том, что его нет в @INC, если он не установлен)

Для любопытных это то же самое, что и perl -e 'use Foo::Bar 99'.

3 голосов
/ 22 марта 2010

Вот программа, которая делает это:

#!/usr/bin/perl
# testmod - test to see if a module is available

use strict;
use warnings;

my $mod = (shift @ARGV) || die "usage: $0 module\n";

# convert module-name to path
my $file = $mod;
$file =~ s{::}{/}gsmx;
$file .= '.pm';

# Pull in the module, if it exists
eval { require $file }
    or die "can't find module $mod\n";

# Get the version from the module, if defined
my $ver;
{ no strict 'refs';
    $ver = ${$mod . "::VERSION"} || 'UNKNOWN';
}
# And its location
my $from = $INC{$file};
print "module $mod is version $ver loaded from $from\n";
3 голосов
/ 17 декабря 2009

instmodsh

NAME
       instmodsh - A shell to examine installed modules

SYNOPSIS
           instmodsh

DESCRIPTION
       A little interface to ExtUtils::Installed to examine installed modules, validate your packlists and even create a tarball from an installed module.

SEE ALSO
       ExtUtils::Installed
2 голосов
/ 17 декабря 2009

Использование pmvers. Как следует из названия, он показывает версию установленного модуля. Если модуль не установлен, он выходит из строя со знакомым сообщением об ошибке: Can't locate … in @INC (@INC contains: …)

Используйте pmpath из того же дистрибутива, чтобы найти путь установки модуля.

1 голос
/ 18 декабря 2009

Утилита pmvers и другие pmtools будут делать то, что вам нужно. В противном случае здесь можно найти однострочную версию модуля:

perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module
1 голос
/ 17 декабря 2009

Я использую эти функции bash / Perl oneliners, чтобы найти номер версии и расположение модулей Perl:

# equivalent to perldoc -l <module>
perlwhere() {
    perl -wle'eval "require $ARGV[0]" or die; ($mod = $ARGV[0]) =~ s|::|/|g; print $INC{"${mod}.pm"}' $1
}

perlversion() {
    perl -M$1 -wle'print $ARGV[0]->VERSION' $1
}

: [ether ~].2$; perlwhere Test::More
/usr/lib/perl5/5.8.8/Test/More.pm
: [ether ~].2$; perlversion Test::More
0.94
1 голос
/ 17 декабря 2009

Я не знаю, есть ли какой-нибудь умный способ для этого. Но то, что я обычно
do - использовать опцию '-l' или '-m' в perldoc. Например:

%perldoc -l XML::Simple<br>

и вывод будет примерно таким, как показано ниже, который является полным путем файла модуля </p> <pre><code>.../lib/XML/Simple.pm

Преимущество этого подхода по сравнению с вашим заключается в том, что если установлен модуль
вывод содержит путь к расположению модуля. Однако, когда модуль не установлен
или, если у него нет perldoc, отображается сообщение об ошибке: «Документация не найдена для ...» ,
делая невозможным различение, если ошибка связана с отсутствующим модулем или отсутствующим
документация. В таком случае опция -m становится удобной, так как печатает все
содержимое файла вместе с путем.

0 голосов
/ 02 сентября 2015

Если вы ищете кроссплатформенный CLI (Linux, OSX, Windows), рассмотрите мою whichpm утилиту ; e.g.:

# Locate the Data::Dumper module, and also print
# version information and core-module status.
$ whichpm -v Data::Dumper
Data::Dumper    2.145   core>=5.005 /usr/lib/perl/5.18/Data/Dumper.pm

Он также может найти случайные дубликаты и список всех установленных модулей.

Если у вас установлен Node.js / io.js, вы можете установить его из реестра npm:

[sudo] npm install whichpm -g

Инструкции по ручной установке и многое другое см. В the repo ; Вот прямая ссылка на скачивание последней версии (будет оставаться актуальной).

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