Come faccio a trovare tutti i moduli utilizzati in uno script Perl e li installo?

StackOverflow https://stackoverflow.com/questions/1304756

  •  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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top