30

私が書いた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
…

これはうまくいくようです。

4

5 に答える 5

27

Module::ScanDepsとそれに付属する "scandeps.pl" ユーティリティを調べてください。プログラムのコンパイルまたは実行後に、コードの依存関係と %INC ダンプの静的 (および再帰的) 分析を実行できます。

静的ソース スキャンでは、依存関係が多すぎると常にエラーが発生することに注意してください。(これは PAR で使用される依存関係スキャナーであり、エンド ユーザーにとって最も簡単であることを目的としています。)

最後に、スクリプトを CPAN ディストリビューションとして配布することを選択できます。それは実際よりもはるかに複雑に聞こえます。Module::Starterのようなものを使用して、暫定的な App::YourScript ディストリビューションの基本的なスケルトンをセットアップできます。スクリプトを bin/ サブディレクトリに置き、Makefile.PL を編集して直接の依存関係をすべて参照します。次に、配布のために次のことを行います。

  1. perl Makefile.PL
  2. 作る
  3. 距離を作る

最後のステップで、適切な App-YourScript-VERSION.tar.gz が生成されます。ここで、クライアントがすべての依存関係をインストールする場合は、次の手順を実行します。

  1. CPAN クライアントを正しくセットアップします。実行して質問に答えるだけです。しかし、あなたはすでにそれを必要としています。
  2. "tar -xz App-YourScript-VERSION.tar.gz && cd App-YourScript-VERSION"
  3. 「cpan」を実行します。

CPAN クライアントは、すべての直接的な依存関係とそれらのディストリビューションの依存関係を自動的にインストールします。設定方法に応じて、前提条件に自動的に再帰的に従うか、毎回y/nでプロンプトを表示します。

この例として、CPAN の App::* ディストリビューションのいくつかをチェックしてみてください。App::Ack が良い例だと思います。おそらく、私の CPAN ディレクトリ (SMUELLER) からの App::* ディストリビューションの 1 つです。

于 2008-12-11T15:19:55.027 に答える
21

%INCスクリプトの最後にダンプすることができます。使用済みおよび必要なすべてのモジュールが含まれます。ただし、もちろん、これは、条件付きでモジュールを必要としない場合にのみ役立ちます($ barの場合はFooが必要です)。

于 2008-12-11T10:43:10.653 に答える
14

頻繁に使用せず、頻繁に使用しない場合は、%INCが最適な方法です。継続的統合テストまたはより堅牢なものでこれを行う必要がある場合は、他のツールが役立ちます。

Steffen はすでに Module::ScanDeps について言及しています。

Test::Prereqのコードはこれを行いますが、Makefile.PL または Build.PL がそれらを依存関係としてリストすることを保証する追加のレイヤーがあります。スクリプトを通常の Perl ディストリビューションのようにすると、新しい依存関係を簡単に確認できます。テストスイートをもう一度実行してください。

それとは別に、静的コードを解析して use および require ステートメントを検索するModule::Extract::Useなどのツールを使用することもできます (ただし、文字列 eval では検出されません)。これにより、スクリプトにロードするように指示したモジュールだけが取得されます。また、ロードしたモジュールがわかれば、ほとんどの CPAN モジュールの依存関係ツリーを既に作成しているDavid Cantrell のCPANdepsツールと組み合わせることができます。

オプション機能についても考慮する必要があることに注意してください。この場合のコードにはそれらがありませんが、必要になるまでモジュールをロードしない場合があります。

サブフー
    {
    バーが必要です。# 必要になるまでロードしない
    ....
    }

試用またはテストでその機能を実行しない場合、その機能に Bar が必要であることはわかりません。モジュールが別の環境 (mod_perl や Windows など) で別の依存モジュールのセットをロードする場合にも、同様の問題が発生します。

そのようなオプション機能をテストして依存関係を取得できる、自動化された優れた方法はありません。しかし、興味深い問題のように聞こえるので、To Do リストに入れるべきだと思います。

于 2008-12-11T18:44:01.477 に答える
7

Dist::Zilla とその AutoPrereqs プラグインで使用される、この分野の別のツールはPerl::PrereqScannerです。scan-perl-prereqsPPI といくつかのプラグインを使用して、定義した最小バージョンを使用して、ほとんどの種類の prereq 宣言を検索するプログラムをインストールします。一般に、これは過剰なスキャンをお勧め%INCします。これは、偽の要件をもたらし、バージョンを無視する可能性があります。

于 2011-05-05T14:11:16.270 に答える
2

今日、私はAutoPrereqプラグインを通じて依存関係を処理できるDist::Zillaを使用して、 CPAN のようなディストリビューションとして Perl アプリを開発しています。この領域のもう 1 つの興味深いコードは、cartonです。

于 2010-05-16T11:57:38.843 に答える