1

私は現在、PAR Packer(pp)を使用して、いくつかのplスクリプトをパッケージ化して、クライアントがCPANをいじくり回さなくても、マシンにコピーして「正常に動作」できるようにしています。

残念ながら、PARPackerは深い依存関係に対しては機能しません。たとえば、スクリプトはCHI :: Driver :: Fileをインポートしますが、CHI :: Driver::Fileが必要とするLog::Any :: Adapter::Nullを明示的にインポートしません。PARはこの依存関係を取得せず、生成されたスクリプトを実行すると、次のエラーメッセージが表示されてクラッシュします。

Can't locate Log/Any/Adapter/Null.pm in @INC (@INC contains: CODE(0x874aab8) /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc/lib /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc CODE(0x87e8f54) CODE(0x87e9194)) at (eval 215) line 3.
Compilation failed in require at CHI/Driver/File.pm line 11.
BEGIN failed--compilation aborted at CHI/Driver/File.pm line 11.

私の回避策は、「Log :: Any :: Adapter :: Null」を明示的にインポートすることですが、もっと良い方法があるはずです。おそらくこれはPARPackerのバグですか?最新バージョン(0.994)をインストールしました。

4

2 に答える 2

3

さて、あなたはドキュメントを読みましたか?依存関係を含めるための多くのコマンドラインオプションが提供され、モジュールを手動で強制的に含めるオプションさえあります。

于 2009-09-15T03:32:15.127 に答える
1

スタンドアロンバイナリ(ppのデフォルトモード)ではなくスタンドアロンスクリプトが必要な場合は、-Pオプションを追加します。しかし、私はそれに反対することをお勧めします。これは、最もテストされていない動作モードです。

PAR::Packerは深い依存関係に対して機能することにも注意してください。あなたの質問の主題は少し大げさです。実際、PAR :: Packerは実際には依存関係自体をチェックしませんが、これをModule::ScanDepsに委任します。現在、Module :: ScanDepsは依存関係スキャンへのヒューリスティックなアプローチであり、依存関係の動的な読み込みで醜いファジングを行うことで壊れる可能性があります。(つまり、実行時にモジュール名を生成し、それらをevalで使用します)。

実際、Log :: Any(CHI :: Driver :: Fileによって使用される)のソースを見ると、モジュールの動的ロードを使用していることがすぐにわかります。これが、:: Adapter::Nullモジュールが取得されない理由です。

一般に、これらの問題を修正するには、そのようなモジュールのModule :: ScanDepsに特別なケースを追加します。このようなモジュールの作成者は、あらゆる種類の静的分析を無効にすることをお勧めします。Module :: ScanDepsの修正バージョンを入手するまでは、-cまたは-xオプションを使用してppを実行し、静的分析のみに依存するのではなく、依存関係の解決にプログラムのコンパイルまたは実行を使用させることができます。拡張されたModule::ScanDepsのバージョンは0.95であり、1日以内にCPANから入手できるはずです。

于 2009-09-16T09:08:50.617 に答える