Как найти все модули, используемые в скрипте Perl, и установить их? - PullRequest
6 голосов
/ 20 августа 2009

Мне дали несколько сценариев Perl для развертывания.

Какой самый простой способ найти и установить все модули, используемые этими сценариями?

EDIT:

Из того, что я могу найти, нет никаких условных включений или включений в уловки.

Ответы [ 4 ]

10 голосов
/ 21 августа 2009

Помогает ли мой Module :: Extract :: Use ? В каталоге examples :

есть extract_modules программа
$ examples/extract_modules -l some_program
 File::Spec
 File::Spec::Functions
 strict
 warning

Вы можете направить этот список на cpan.

$ examples/extract_modules -l some_program | xargs cpan

Если у вас есть этот список, являющийся только первым уровнем зависимостей, вы можете создать сценарий распространения , который позволит людям использовать обычный набор инструментов CPAN для установки всего.

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

3 голосов
/ 20 августа 2009

Я надеялся, Module :: ScanDeps , который предоставляет утилиту командной строки scandeps.pl , будет полезен здесь, но, к моему ужасу, Module::ScanDeps, очевидно, не предназначен для этого В частности, scandeps.pl либо игнорирует отсутствующие модули, либо (с -c или -x) хрипит, когда скрипт использует модуль, который не установлен.

Вот быстрый и непростой Perl-сценарий, который пытается выполнить сценарий, используя do , пока он не завершится успешно:

#!/usr/bin/perl

use strict;
use warnings;

use Term::Prompt;

my ($script) = @ARGV;

die "Provide script file name on the command line\n"
    unless defined $script;

until ( do $script ) {
    my $ex = $@;
    if ( my ($file) = $ex =~ /^Can't locate (.+?) in/ ) {
        my $module = $file;
        $module =~ s/\.(\w+)$//;
        $module = join('::', split '/', $module);
        print "Attempting to install '$module' via cpan\n";
        system(cpan => $module);
        last unless prompt(y => 'Try Again?', '', 'n');
    }
    else {
        die $ex;
    }
}

Если вы не хотите запускать скрипт, вы можете запустить perl -c $script, захватить stderr вывод этого и проанализировать пропущенные сообщения модуля и вызвать cpan для каждого такого модуля, найденного до тех пор, пока perl -c $script выводит " Синтаксис ОК ". Это дает вам более чистую петлю тоже. Я посмотрю на это позже.

Вы можете пропустить зависимости, загруженные во время выполнения, используя эту технику.

1 голос
/ 20 августа 2009

Ну, это очень упрощенный способ Я решил это.

В оболочке bash:

cat *.pl  | grep "^use " | tr ';' ' ' | while read a b c; do echo $b; done | sort -iu > modules.txt 

Это дало мне файл только с именами модулей, по одному в каждой строке.

Я тогда использовал это

cat modules.txt | while read a; do cpan $a; done 

для вызова cpan для каждого имени модуля в файле. А затем сел там, отвечая «да» на вопросы CPAN, чтобы установить соответствующие зависимости.

Не красиво, но на этот раз оно выполнило свою работу.

0 голосов
/ 20 августа 2009

Или пусть pp PAR сделает всю работу за вас, собрав все необходимое в один исполняемый файл.

...