Wie finde ich alle in einem Perl-Skript verwendeten Module und installiere sie?
-
19-09-2019 - |
Frage
Mir wurden einige Perl-Skripte zur Bereitstellung gegeben.
Was ist der einfachste Weg, alle von diesen Skripten verwendeten Module zu finden und zu installieren?
BEARBEITEN:
Soweit ich weiß, gibt es in Auswertungen keine bedingten Einschlüsse oder Einschlüsse.
Lösung
Ist mein Module :: Extract :: Verwendung helfen? Es gibt ein extract_modules Programm in der Beispiele Verzeichnis:
$ examples/extract_modules -l some_program
File::Spec
File::Spec::Functions
strict
warning
Sie können Leitung, die Liste cpan
.
$ examples/extract_modules -l some_program | xargs cpan
Sobald Sie diese Liste, die nur die erste Stufe der Abhängigkeiten ist, können Sie ein Skript Verteilung , die Menschen zu nutzen, um die normale CPAN Werkzeugkette erlaubt, alles zu installieren.
Wenn es etwas gibt, das nicht für Sie arbeiten, ändern Sie das Programm damit umgehen. Wenn Sie denken, wäre es für andere Menschen nützlich sein, eine Pull-Anforderung zu senden. :)
Andere Tipps
Ich hatte gehofft, Module :: ScanDeps , die das Kommandozeilenprogramm bietet < a href = "http://search.cpan.org/perldoc/scandeps.pl" rel = "nofollow noreferrer"> scandeps.pl hier nützlich sein würde, aber zu meinem Entsetzen, ist Module::ScanDeps
offenbar nicht beabsichtigt entweder dieser bestimmte Zweck als scandeps.pl
ignoriert fehlende Module oder (mit -c
oder -x
) krächzt, wenn das Skript ein Modul verwendet, das nicht installiert ist.
Hier ist ein quick'n'dirty Perl-Skript, das das Skript mit tun 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 = $@;
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 das Skript nicht wollen, ausgeführt werden, können Sie perl -c $script
, Capture stderr
Ausgang davon laufen und analysieren für Modul-Nachrichten fehlen und rufen cpan
für jedes solche Modul bis perl -c $script
Ausgänge „Syntax OK“ gefunden. Das gibt Ihnen eine sauberere zu Schleife. Ich werde später aussehen.
Sie können Abhängigkeiten zur Laufzeit mit dieser Technik geladen entgehen lassen.
Nun ja, das ist es auf die ganz einfache Art und Weise Ich habe das gelöst.
In einer Bash-Shell:
cat *.pl | grep "^use " | tr ';' ' ' | while read a b c; do echo $b; done | sort -iu > modules.txt
Dadurch erhielt ich eine Datei nur mit den Modulnamen, einen in jeder Zeile.
Das habe ich dann verwendet
cat modules.txt | while read a; do cpan $a; done
um cpan für jeden Modulnamen in der Datei aufzurufen.Und dann saß ich da und beantwortete die Fragen von CPAN mit Ja, um die Abhängigkeiten entsprechend zu installieren.
Nicht schön, aber dieses Mal hat es seinen Zweck erfüllt.
oder lassen Sie PAR pp die Arbeit für Sie tun in alles zu sammeln zusammen Sie in ein brauchen einzelne ausführbare Datei.