2009-08-20 3 views

Antwort

10

Hilft meine Module::Extract::Use? Es gibt eine extract_modules program in den Beispiele Verzeichnis:

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

Sie können Rohr, das zu cpan Liste.

$ examples/extract_modules -l some_program | xargs cpan 

Sobald Sie diese Liste, die nur die erste Stufe der Abhängigkeiten ist, können Sie eine script distribution machen, dass die Menschen die normale CPAN Werkzeugkette zu verwenden, ermöglicht es, alles zu installieren.

Wenn etwas nicht für Sie funktioniert, ändern Sie das Programm, um damit umzugehen. Wenn Sie denken, dass es für andere Menschen nützlich wäre, senden Sie eine Pull-Anfrage. :)

+0

Sieht vielversprechend aus – Nifle

1

Nun, das ist die sehr vereinfachende Art und Weise Ich löste dies.

In einem Bash-Shell:

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

Dies gab mir eine Datei nur mit den Modulnamen, eine auf jeder Zeile.

habe ich dann dieses

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

cpan zu jedem Modulnamen in der Datei aufzurufen. Und dann saß ich da und beantwortete die Fragen von CPAN mit Ja, um Abhängigkeiten zu installieren.

Nicht schön, aber dieses Mal hat es die Arbeit erledigt.

+0

Wie wäre es mit Modulen, die nicht verwendet, aber benötigt werden? – innaM

+0

Ich würde die Grep in der ersten Zeile entsprechend anpassen – Nifle

+0

Was ist mit Zeilen, wo 'verwenden' ist nicht das erste Ding auf der Linie? Es erlaubt nicht einmal optionale Leerzeichen. –

3

ich Module::ScanDeps hatte gehofft, dass die scandeps.pl das Kommandozeilenprogramm bietet hier wäre nützlich, aber zu meinem Entsetzen, ist Module::ScanDeps offenbar nicht für diesen speziellen Zweck als scandeps.pl soll entweder ignoriert fehlende Module oder (mit -c oder -x) krächzt, wenn die Skript verwendet ein Modul, das nicht installiert ist.

Hier ist ein quick'n'dirty Perl-Skript, das das Skript mit do auszuführen versucht, bis es gelingt:

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

Wenn Sie werden nicht laufen das Skript möchten, können Sie perl -c $script ausführen können, zu erfassen stderr Ausgabe von diesem und parsen für fehlende Modul Nachrichten und Anruf cpan für jedes solche Modul gefunden, bis perl -c $script Ausgänge "Syntax OK". Das gibt dir auch eine sauberere Schleife. Ich werde mir das später ansehen.

Sie können Abhängigkeiten, die zur Laufzeit mit dieser Technik geladen werden, übersehen.

+1

Ist das nicht ein bisschen gefährlich? Das Skript $ könnte etwas störend machen. – Nifle

+1

Versuchen Sie nicht, das Skript auszuführen? Zu diesem Zeitpunkt müssen Sie entschieden haben, dass das Skript lauffähig ist und Sie nur die Abhängigkeiten benötigen. –

+0

Ich wurde gebeten, diese jeden Tag um 3 Uhr morgens zu laufen (sie machen einige db Wartung). Es ist nicht für mich zu entscheiden, ob es in Ordnung ist, sie tagsüber auszuführen, nur um die Abhängigkeiten zu installieren. (Und ich möchte auch nicht bis 3 Uhr morgens warten). Ich stimme zu, dass dies meistens kein Problem ist. Deshalb habe ich darauf hingewiesen, dass es ein bisschen gefährlich sein könnte. – Nifle

0

Oder lassen Sie PAR's pp die Arbeit für Sie sammeln alles zusammen, was Sie brauchen in einer einzigen ausführbaren Datei.

+0

Ich glaube nicht, dass 'pp' fehlende Abhängigkeiten installiert. Fehle ich etwas? –

Verwandte Themen