Come faccio a trovare tutti i moduli utilizzati in uno script Perl e li installo?
-
19-09-2019 - |
Domanda
Mi è stato dato un paio di script Perl per la distribuzione.
Qual è il modo più semplice per trovare e installare tutti i moduli utilizzati da questi script?
Modifica
Da quello che posso trovare ci sono include alcuna condizione o include in evals.
Soluzione
La mia Modulo :: :: estratto Usa aiuto? C'è un extract_modules in Esempi directory:
$ examples/extract_modules -l some_program
File::Spec
File::Spec::Functions
strict
warning
È possibile reindirizzare tale elenco per cpan
.
$ examples/extract_modules -l some_program | xargs cpan
Una volta che avete tale elenco, che è solo il primo livello delle dipendenze, è possibile effettuare una lo script di distribuzione che permette alle persone di utilizzare il normale toolchain CPAN per installare tutto.
Se c'è qualcosa che non funziona per voi, modificare il programma per gestire questo. Se si pensa che sarebbe utile ad altre persone, inviare una richiesta di pull. :)
Altri suggerimenti
Modulo :: ScanDeps che fornisce l'utilità della riga di comando < a href = "http://search.cpan.org/perldoc/scandeps.pl" rel = "nofollow noreferrer"> scandeps.pl sarebbe utile qui, ma, con mio grande sgomento, Module::ScanDeps
è a quanto pare non destinato questo scopo particolare scandeps.pl
sia ignora moduli mancanti o (con -c
o -x
) gracchia quando lo script utilizza un modulo che non è installato.
Ecco uno script Perl quick'n'dirty che cerca di eseguire lo script utilizzando do fino a quando non riesce:
#!/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;
}
}
Se non si desidera che lo script da eseguire, è possibile eseguire perl -c $script
, uscita cattura stderr
di questo e analizzare i messaggi mancanti modulo e chiamare cpan
per ogni tale modulo trovato fino a quando le uscite perl -c $script
"Sintassi OK". Che ti dà un ciclo più pulito troppo. Io guardo questo più tardi.
Si potrebbe perdere le dipendenze caricati in fase di esecuzione utilizzando questa tecnica.
Bene, questo è il modo molto semplicistico Ho risolto questo.
In una shell bash:
cat *.pl | grep "^use " | tr ';' ' ' | while read a b c; do echo $b; done | sort -iu > modules.txt
Questo mi ha dato un file con solo i nomi dei moduli, uno per ogni riga.
Ho quindi utilizzato questo
cat modules.txt | while read a; do cpan $a; done
per richiamare CPAN a ciascun nome del modulo nel file. E poi lì seduto rispondere sì alle domande di CPAN per installare le dipendenze a seconda dei casi.
Non bella, ma questa volta ottenuto il lavoro fatto.
pp del PAR fare il lavoro per voi nel raccogliere insieme tutto quello che serve in un unico eseguibile.