Wie finde ich alle in einem Perl-Skript verwendeten Module und installiere sie?

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

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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top