Я надеялся, 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
выводит " Синтаксис ОК ". Это дает вам более чистую петлю тоже. Я посмотрю на это позже.
Вы можете пропустить зависимости, загруженные во время выполнения, используя эту технику.