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

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

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

5
задан brian d foy 17 December 2009 в 19:50
поделиться

8 ответов

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

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 .

9
ответ дан 18 December 2019 в 06:22
поделиться

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
3
ответ дан 18 December 2019 в 06:22
поделиться

Я использую эти функции 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
ответ дан 18 December 2019 в 06:22
поделиться

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

% perldoc -l XML :: Simple

, и результат будет примерно таким, как показано ниже, это полный путь к файлу модуля.

.../lib/XML/Simple.pm

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

1
ответ дан 18 December 2019 в 06:22
поделиться

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

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

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

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

5
ответ дан 18 December 2019 в 06:22
поделиться

Use pmvers. Like the name suggests, it shows the version of an installed module. If a module is not installed, it fails with the familiar error message: Can't locate … in @INC (@INC contains: …)

Use pmpath from the same distribution to find a module's installation path.

2
ответ дан 18 December 2019 в 06:22
поделиться

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

perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module
1
ответ дан 18 December 2019 в 06:22
поделиться

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

#!/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
ответ дан 18 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: