Perl スクリプトで使用されているすべてのモジュールを見つけてインストールするにはどうすればよいですか?
-
19-09-2019 - |
質問
デプロイする Perl スクリプトがいくつか与えられました。
これらのスクリプトで使用されるすべてのモジュールを見つけてインストールする最も簡単な方法は何ですか?
編集:
私が見つけた限りでは、条件付きの include や eval に include はありません。
解決
私の モジュール::抽出::使用 ヘルプ?あるよ 抽出モジュール プログラム の中に 例 ディレクトリ:
$ examples/extract_modules -l some_program
File::Spec
File::Spec::Functions
strict
warning
そのリストをパイプすることができます cpan
.
$ examples/extract_modules -l some_program | xargs cpan
依存関係の最初のレベルにすぎないリストを取得したら、 スクリプト配布 これにより、通常の CPAN ツールチェーンを使用してすべてをインストールできるようになります。
何かうまくいかない場合は、それを処理できるようにプログラムを変更します。他の人にとって役立つと思われる場合は、プル リクエストを送信してください。:)
他のヒント
期待してた モジュール::ScanDeps コマンドラインユーティリティを提供します スキャンデプス.pl ここでは役に立ちますが、残念なことに、 Module::ScanDeps
明らかにこの特定の目的を意図したものではありません scandeps.pl
不足しているモジュールを無視するか、( -c
または -x
) スクリプトがインストールされていないモジュールを使用するとエラーが発生します。
これは、次を使用してスクリプトを実行しようとする簡単で汚い 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
その出力と欠落しているモジュールメッセージを解析して呼び出します cpan
このようなモジュールが見つかるまで、 perl -c $script
「構文OK」が出力されます。これにより、よりクリーンなループも得られます。これについては後で見ていきます。
この手法を使用すると、実行時にロードされる依存関係を見逃す可能性があります。
まあこれは 非常に単純な方法 これで解決しました。
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 の質問に「はい」と答えてそこに座っていました。
あまりきれいではありませんが、今回はうまくいきました。
あるいはさせてください PARのpp 必要なものすべてを 1 つの実行可能ファイルにまとめます。