Perlスクリプトのモジュール依存関係を見つけるにはどうすればよいですか?
私が書いたPerlスクリプトを別の開発者に実行してもらいたい。スクリプトは、スクリプトを実行する前にインストールする必要がある多くのCPANモジュールを使用します。スクリプト(またはPerl
バイナリ)を作成して、欠落しているすべてのモジュールのリストをダンプすることは可能ですか?スクリプトを実行しようとすると、Perlは欠落しているモジュールの名前を出力しますが、これは冗長であり、欠落しているすべてのモジュールを一度にリストするわけではありません。次のようなことをしたいのですが。
$ cpan -i `said-script --list-deps`
あるいは:
$ list-deps said-script > required-modules # on my machine
$ cpan -i `cat required-modules` # on his machine
それを行う簡単な方法はありますか?これはショーストッパーではありませんが、他の開発者の生活を楽にしていきたいと思います。 (必要なモジュールが複数のファイルに散在しているため、何も見逃さずに手動でリストを作成するのは簡単ではありません。私は [〜#〜] par [〜#〜] について知っていますが、私が望むものには少し複雑すぎるようです。)
更新:ありがとう、マニ、それでいい。 %INC
については知りませんでしたが、@INC
についてしか知りませんでした。私はこのようなもので解決しました:
print join("\n", map { s|/|::|g; s|\.pm$||; $_ } keys %INC);
印刷するもの:
Moose::Meta::TypeConstraint::Registry
Moose::Meta::Role::Application::ToClass
Class::C3
List::Util
Imager::Color
…
これはうまくいくようです。
スクリプトの最後に%INC
をダンプできます。使用済みおよび必須のすべてのモジュールが含まれます。ただし、もちろん、これは、条件付きでモジュールを必要としない場合にのみ役立ちます($ barの場合はFooが必要です)。
Module :: ScanDeps とそれに付属する「scandeps.pl」ユーティリティを確認してください。プログラムのコンパイル後または実行後に、依存関係と%INCダンプについて、コードの静的(および再帰的)分析を実行できます。
静的ソーススキャンは、依存関係が多すぎるという側面で常にエラーになることに注意してください。 (これはPARで使用される依存関係スキャナーであり、エンドユーザーにとって最も簡単なものを目指しています。)
最後に、スクリプトをCPANディストリビューションとして配布することを選択できます。それは実際よりもはるかに複雑に聞こえます。 Module :: Starter のようなものを使用して、暫定的なApp :: YourScriptディストリビューションの基本的なスケルトンを設定できます。スクリプトをbin /サブディレクトリに置き、Makefile.PLを編集して、すべてのdirect依存関係を参照します。次に、配布のために次のことを行います。
- Perl Makefile.PL
- make
- 距離を作る
最後のステップでNiceApp-YourScript-VERSION.tar.gzが生成されます。クライアントがすべての依存関係をインストールする場合、次のようにします。
- CPANクライアントを正しく設定します。実行して質問に答えるだけです。しかし、とにかくすでにそれを要求しています。
- "tar -xz App-YourScript-VERSION.tar.gz && cd App-YourScript-VERSION"
- 「cpan」を実行します。
CPANクライアントは、すべての直接依存関係とそれらのディストリビューションの依存関係を自動的にインストールするようになりました。設定方法に応じて、前提条件に自動的に再帰的に従うか、毎回y/nでプロンプトを表示します。
この例として、CPANのApp :: *ディストリビューションのいくつかをチェックしてみてください。 App :: Ackが良い例だと思います。たぶん、私のCPANディレクトリ(SMUELLER)からのApp :: *ディストリビューションの1つです。
すばやく汚い、まれにしか使用しない場合は、%INC
が最善の方法です。継続的インテグレーションテストまたはより堅牢なものでこれを行う必要がある場合は、他にも役立つツールがいくつかあります。
SteffenはすでにModule :: ScanDepsについて言及しています。
Test :: Prereq のコードはこれを行いますが、Makefile.PLまたはBuild.PLがそれらを依存関係としてリストすることを保証する追加のレイヤーがあります。 スクリプトは通常のPerlディストリビューションのように見えます にすると、新しい依存関係を確認するのがかなり簡単になります。テストスイートを再度実行するだけです。
それとは別に、 Module :: Extract :: Use などのツールを使用することもできます。このツールは、静的コードを解析してuseステートメントとrequireステートメントを探します(ただし、文字列評価では見つかりません)。これで、スクリプトにロードするように指示したモジュールだけが取得されます。また、ロードしたモジュールがわかれば、ほとんどのCPANモジュールの依存関係ツリーを既に作成しているDavid Cantrellの CPANdeps ツールと組み合わせることができます。
オプション機能についても考慮する必要があることに注意してください。この場合のコードにはそれらがありませんが、必要になるまでモジュールをロードしない場合があります。
sub foo { にはBarが必要です。 #使用する必要があるまでロードしない .... }
試運転またはテストでその機能を実行しない場合、その機能にBarが必要であることがわかりません。モジュールが異なる環境(たとえば、mod_PerlやWindowsなど)で異なる依存関係モジュールのセットをロードすると、同様の問題が発生します。
依存関係を取得できるように、そのようなオプション機能をテストするための優れた自動化された方法はありません。しかし、それは興味深い問題のように聞こえるので、私のToDoリストに含めるべきだと思います。
Dist :: ZillaとそのAutoPrereqsプラグインで使用されるこの領域の別のツールは、 Perl :: PrereqScanner です。 PPIといくつかのプラグインを使用して、定義した最小バージョンを使用して、ほとんどの種類の前提条件宣言を検索するscan-Perl-prereqs
プログラムをインストールします。一般に、スキャンよりもこれをお勧めします%INC
。これは偽の要件をもたらす可能性があり、バージョンを無視します。
今日、私はPerlアプリを CPANのようなディストリビューション として開発します Dist :: Zilla を使用して、 AutoPrereq プラグインを介して依存関係を処理できます。この領域のもう1つの興味深いコードは、 carton です。