8

デプロイするPerlスクリプトがいくつか与えられました。

これらのスクリプトで使用されるすべてのモジュールを見つけてインストールする最も簡単な方法は何ですか?

編集:

私が見つけることができることから、評価に条件付きインクルードまたはインクルードはありません。

4

4 に答える 4

12

Module :: Extract ::ヘルプを使用しますか?examplesディレクトリにextract_modulesプログラムがあります。

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

そのリストをにパイプできますcpan

$ examples/extract_modules -l some_program | xargs cpan

依存関係の最初のレベルにすぎないリストを取得したら、通常のCPANツールチェーンを使用してすべてをインストールできるスクリプト配布を作成できます。

うまくいかないことがある場合は、それを処理するようにプログラムを変更してください。他の人に役立つと思われる場合は、プルリクエストを送信してください。:)

于 2009-08-21T15:32:23.227 に答える
3

コマンドラインユーティリティscandeps.plを提供するModule::ScanDepsがここで役立つことを期待していましたが、スクリプトがインストールされていないモジュール。Module::ScanDepsscandeps.pl-c-x

これは、成功するまでdoを使用してスクリプトを実行しようとする簡単な「n」ダーティなPerlスクリプトです 。

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

スクリプトを実行したくない場合は、スクリプトを実行してその出力をperl -c $scriptキャプチャstderrし、欠落しているモジュールメッセージを解析して、「SyntaxOK」が出力cpanされるまでそのような各モジュールを呼び出すことができます。perl -c $scriptそれはあなたにもよりきれいなループを与えます。これについては後で見ていきます。

この手法を使用すると、実行時にロードされた依存関係を見逃す可能性があります。

于 2009-08-20T11:02:33.107 に答える
2

これは私がこれを解決した非常に単純な方法です。

bashシェルの場合:

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

これにより、各行に1つずつ、モジュール名のみを含むファイルが作成されました。

その後、これを使用しました

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

ファイル内の各モジュール名に対してcpanを呼び出します。そしてそこに座って、CPANの質問に「はい」と答え、必要に応じて依存関係をインストールしました。

きれいではありませんが、今回は仕事が終わりました。

于 2009-08-20T09:11:31.647 に答える
0

または、PARのppに、必要なすべてのものを1つの実行可能ファイルにまとめる作業を任せます。

于 2009-08-20T11:14:24.393 に答える