私たちは膨大な数の perl モジュールを維持していますが、実際にはあまりにも巨大なので、私たちが担当しているすべてのモジュールを把握することさえできません。モジュールを更新するリスクがあるかどうかを評価し、何に影響するかを知ることができるように、できればモジュール名で保存された何らかのログで、どのスクリプトとモジュールが別のモジュールにアクセスするかを追跡したいと考えています。
これを行う簡単な方法はありますか?
私たちは膨大な数の perl モジュールを維持していますが、実際にはあまりにも巨大なので、私たちが担当しているすべてのモジュールを把握することさえできません。モジュールを更新するリスクがあるかどうかを評価し、何に影響するかを知ることができるように、できればモジュール名で保存された何らかのログで、どのスクリプトとモジュールが別のモジュールにアクセスするかを追跡したいと考えています。
これを行う簡単な方法はありますか?
簡単な正規表現検索を実行できます。
use strict;
use warnings;
my %modules;
foreach my $perl_file (@file_list) {
open FILE, $perl_file or die "Can't open $perl_file ($!)";
while (<FILE>) {
if (/\s*(?:use|require)\s*([^;]+);/) {
$modules{$1}{$perl_file}++;
}
}
}
これは手早く汚いですが、かなりうまくいくはずです。最終的にモジュールのハッシュになり、それぞれがそれを使用するファイルのハッシュを指します。
もちろん、それは次のようなものをキャッチしますuse strict;
が、それらは無視するのに十分簡単です。
次のようなものがある場合はuse Module qw/function/;
、セミコロンの前のすべてを取得しますが、大したことではありません。既知のモジュール名のキーを検索するだけです。
欠点は、依存関係を追跡しないことです。その情報が必要な場合は、cpan などから取得して追加できます。
更新:実行時にこれをログに記録する場合は、ラッパー スクリプトを作成し、perl
コマンドがシステム上のラッパーを指すようにすることができます。次に、ラッパーを次のようにします。
use strict;
use warnings;
use Module::Loaded;
my $script = shift @ARGV;
#run program
do $script;
#is_loaded() gets the path of these modules if they are loaded.
print is_loaded('Some::Module');
print is_loaded('Another::Module');
ただし、スクリプトを呼び出す方法が変更されたため、おかしな副作用が発生する可能性があります。それはあなたが何をしているかによります。
Perl が実行されるたびにログに情報を書き込み、それを分析するように、sitecustomize.pl を編集することはできますか? 次のようなものを sitecustomize.pl に追加します。
open (LOG, '>>',"absolutepathto/logfile.txt");
print LOG $0,"\t",$$,"\t",scalar(localtime),"\n";
open SELF, $0;
while (<SELF>) {
print LOG $_ if (/use|require/);
}
close SELF;
print LOG "_" x 80,"\n";
close LOG;
編集: また、%INC ハッシュを忘れていたので、上記のコードを次のように書き直して、実際にロードされたモジュールに関するデータを追加し、do 関数に必要なファイルを含めます。
open (LOG, '>>',"absolutepathto/logfile.txt");
print LOG $0,' ',$$,' ',scalar(localtime),"\n";
open SELF, $0;
while (<SELF>) {
print LOG $_ if (/use|require/);
}
close SELF;
END {
local $" = "\n";
print LOG "Files loaded by use, eval, or do functions at the end of this program run:\n";
print LOG "@{[values %INC]}","\n";
print LOG "_" x 80,"\n";
close LOG;
}