2009-08-20 20 views

Odpowiedz

10

Czy mój Module::Extract::Use pomaga? Jest takie extract_modules program w przykładach katalogu:

$ examples/extract_modules -l some_program 
File::Spec 
File::Spec::Functions 
strict 
warning 

Można rurę że listy do cpan.

$ examples/extract_modules -l some_program | xargs cpan 

Gdy masz tę listę, która jest tylko pierwszy stopień zależności, można dokonać script distribution który pozwala ludziom używać normalnego CPAN toolchain zainstalować wszystko.

Jeśli jest coś, co nie działa dla ciebie, zmodyfikuj program, aby sobie z tym poradzić. Jeśli uważasz, że byłoby to przydatne dla innych osób, wyślij żądanie ściągnięcia. :)

+0

Wygląda obiecująco – Nifle

1

Cóż to jest bardzo uproszczony sposób Rozwiązałem to.

w powłoce bash:

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

To dało mi plik tylko z nazwy modułów, po jednym na każdej linii.

Potem użył tego

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

powołać cpan do nazwy każdego modułu w pliku. A potem siedział i odpowiadał tak na pytania CPAN, aby zainstalować odpowiednie zależności.

Nie jest ładna, ale tym razem wykonała zadanie.

+0

Co z modułami, które nie są używane, ale wymagają? – innaM

+0

Chciałbym dostosować grep w pierwszym wierszu odpowiednio – Nifle

+0

Co powiesz na linie, w których 'use' nie jest pierwszą rzeczą na linii? Nie pozwala nawet na opcjonalne spacje. –

3

Miałem nadzieję Module::ScanDeps który dostarcza narzędzia wiersza polecenia scandeps.pl byłyby użyteczne tutaj, ale, ku mojemu przerażeniu, Module::ScanDeps najwyraźniej nie przeznaczony do tego konkretnego celu, jak scandeps.pl albo ignoruje brakujących modułów lub (z -c lub -x) croaks gdy skrypt używa modułu, który nie jest zainstalowany.

Oto quick'n'dirty Perl skrypt, który próbuje wykonać skrypt za pomocą do aż do skutku:

#!/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; 
    } 
} 

Jeśli nie chcesz skrypt do uruchomienia, można uruchomić perl -c $script, przechwytywanie stderr dane wyjściowe tego i analizowanie dla brakujących wiadomości modułu i wywołanie cpan dla każdego takiego modułu znalezionego do perl -c $script wyświetla "Składnia OK". To daje ci również czystszą pętlę. Przyjrzę się temu później.

Można pominąć zależności załadowane w czasie wykonywania przy użyciu tej techniki.

+1

Czy to nie jest trochę niebezpieczne? Skrypt $ może zrobić coś destrukcyjnego. – Nifle

+1

Nie próbujesz uruchomić skryptu? W tym momencie musisz zdecydować, że skrypt jest warty uruchomienia, a potrzebujesz tylko zależności. –

+0

Powiedziano mi, żebym prowadził je każdego dnia o 3 rano (robią trochę db konserwacji). Nie do mnie należy decyzja, czy można uruchomić je w ciągu dnia, aby zainstalować zainstalowane zależności. (I nie chcę też czekać do 3 rano). Zgadzam się, że najczęściej nie jest to problem. Dlatego zwróciłem uwagę, że może to być trochę niebezpieczne. – Nifle

0

Albo pozwól PAR's pp wykonać pracę za ciebie, zbierając razem wszystko, czego potrzebujesz w jednym pliku wykonywalnym.

+0

Nie uważam, że 'pp' instaluje brakujące zależności. Czy czegoś brakuje? –

Powiązane problemy