2009-08-20 6 views

risposta

10

Il mio telefono Module::Extract::Use aiuta? C'è un extract_modules program negli 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 script distribution che permette alle persone di utilizzare il normale toolchain CPAN per installare tutto.

Se c'è qualcosa che non funziona per te, modifica il programma per gestirlo. Se pensi che sarebbe utile ad altre persone, invia una richiesta di pull. :)

+0

Sembra promettente – Nifle

1

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

Ho quindi utilizzato questo

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

invocare CPAN a ciascun nome del modulo nel file. E poi si è seduto lì rispondendo sì alle domande di CPAN per installare le dipendenze come appropriato.

Non carino ma questa volta ha fatto il lavoro.

+0

Che ne dici di moduli che non sono stati utilizzati ma richiesti? – innaM

+0

Mi piacerebbe regolare il grep nella prima riga di conseguenza – Nifle

+0

Che dire delle linee dove 'use' non è la prima cosa sulla linea? Non consente nemmeno spazi opzionali. –

3

Speravo Module::ScanDeps che fornisce l'utilità della riga di comando scandeps.pl sarebbe utile qui, ma, con mio grande sgomento, Module::ScanDeps è a quanto pare non destinato a tale scopo particolare per quanto scandeps.pl o ignora i moduli mancanti o (con -c o -x) gracchia quando il 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 = [email protected]; 
    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, cattura stderr emettere quello e analizzare per i messaggi di modulo mancanti e chiamare cpan per ogni modulo trovato fino a perl -c $script uscite "Sintassi OK". Questo ti dà anche un ciclo più pulito. Lo vedrò più tardi.

Si potrebbero perdere le dipendenze caricate in fase di esecuzione utilizzando questa tecnica.

+1

Non è un po 'pericoloso? Lo script $ potrebbe fare qualcosa di dirompente. – Nifle

+1

Non stai provando a eseguire lo script? A questo punto, devi aver deciso che vale la pena eseguire lo script e hai solo bisogno delle dipendenze. –

+0

Mi è stato detto di eseguirli tutti i giorni alle 3 di mattina (fanno qualche manutenzione in db). Non spetta a me decidere se è corretto eseguirli durante il giorno solo per far installare le dipendenze. (E non voglio nemmeno aspettare le 3 del mattino). Sono d'accordo che la maggior parte delle volte questo non è probabilmente un problema. Ecco perché ho fatto notare che potrebbe essere ** un po 'pericoloso. – Nifle

0

oppure lasciare che lo PAR's pp esegua il lavoro per voi raccogliendo tutto ciò che vi serve in un unico file eseguibile.

+0

Non penso che 'pp' installi le dipendenze mancanti. Mi sto perdendo qualcosa. –