質問

現在、PAR Packer(pp)を使用して、いくつかのplスクリプトをパッケージ化します。クライアントがCPANをいじる必要はありません。

残念ながら、PAR Packerは深い依存関係では機能しません。たとえば、スクリプトは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"をインポートすることです。しかし、より良い方法がなければなりません。おそらくこれはPAR Packerのバグですか?最新バージョン(0.994)をインストールしました。

役に立ちましたか?

解決

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

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

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

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

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top