デプロイするPerlスクリプトがいくつか与えられました。
これらのスクリプトで使用されるすべてのモジュールを見つけてインストールする最も簡単な方法は何ですか?
編集:
私が見つけることができることから、評価に条件付きインクルードまたはインクルードはありません。
デプロイするPerlスクリプトがいくつか与えられました。
これらのスクリプトで使用されるすべてのモジュールを見つけてインストールする最も簡単な方法は何ですか?
編集:
私が見つけることができることから、評価に条件付きインクルードまたはインクルードはありません。
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ツールチェーンを使用してすべてをインストールできるスクリプト配布を作成できます。
うまくいかないことがある場合は、それを処理するようにプログラムを変更してください。他の人に役立つと思われる場合は、プルリクエストを送信してください。:)
コマンドラインユーティリティscandeps.plを提供するModule::ScanDepsがここで役立つことを期待していましたが、スクリプトがインストールされていないモジュール。Module::ScanDeps
scandeps.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
それはあなたにもよりきれいなループを与えます。これについては後で見ていきます。
この手法を使用すると、実行時にロードされた依存関係を見逃す可能性があります。
これは私がこれを解決した非常に単純な方法です。
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つの実行可能ファイルにまとめる作業を任せます。