2

私は Perl で書かれたプロジェクトを引き継ぎました。このプロジェクトにはTemplate::Toolkit、 、Image::ExifTool、およびなどのいくつかの依存関係がGDあります。--prefix現在、これらの依存関係は、 のオプションを使用してディレクトリ (「deps」フォルダ) に組み込まれていますmake。メインの Perl スクリプトでは、必要なモジュールをインポートするために次のようなものがあります。

use File::Spec::Functions qw(catdir);
use lib "lib";
use lib catdir(qw(deps lib perl5 site_perl));

catdir特定のシステム要件から逸脱するために使用されます(「/」がフォルダー区切り文字であると想定するなど。誰かが別の代替手段を持っている場合、私は提案を受け入れます!)。「lib」フォルダーには私のモジュールが含まれており、「deps/lib/perl5/site_perl」フォルダーは私の依存関係が元のマシンにインストールされた場所です。

ただし、別のマシンで依存関係を構築した後、必要なライブラリが別のフォルダーに移動したようです。スクリプトを正しく実行するには、次のステートメントを使用する必要があります。

use File::Spec::Functions qw(catdir);
use lib "lib";
use lib catdir(qw(deps lib perl 5.14.2));
use lib catdir(qw(deps share perl 5.14.2));

use libとにかくプレフィックスディレクトリ(「deps」)を指定し、プラグマでそのディレクトリを再帰的に検索して依存関係を検索するかどうか疑問に思っていました。また、このスクリプトのユーザーはインターネットにアクセスできないため、私のプロジェクトを CPAN モジュールとしてコンパイルすることは非生産的です。

助けてくれてありがとう!

4

1 に答える 1

3

モジュールをインストールするときは、Makefile.PLにINSTALL_BASE を使用し、Build.PL に --install_base を使用します。安定した設置場所を提供します。PREFIX と --prefix は、perl のシステム ライブラリがどのように配置されているかをエミュレートしようとし、パッケージの作成により便利です。

またrel2abs、パスを lib に渡す前にパスを実行して、絶対パスを取得する必要があります。chdirこれにより、コードが s になってからモジュールを試行した場合に保護されrequireます。または、 lib::absを使用できます。

池上は正しいです。lib に渡されるファイル パスをポータブルにする必要はありません。Unix スタイルで渡すだけです。Perlはそれを理解します。

于 2012-07-31T03:50:26.920 に答える