別のディレクトリにあるPerlモジュールを含めるにはどうすればよいですか?それを含むモジュールからの相対パスである必要があります。
私はもう試した
Push ( @INC,"directory_path/more_path");
また
Push ( @INC,"directory_path\\more_path");
編集:最初に この質問 から正しいソリューションを最初に置きます。 moduleディレクトリに関連して検索するのはこれだけです:
use FindBin; # locate this script
use lib "$FindBin::Bin/.."; # use the parent directory
use yourlib;
currentディレクトリに関連するライブラリを検索する他の多くの方法があります。 -I引数を使用してPerlを呼び出し、他のモジュールのディレクトリを渡すことができます。
Perl -I.. yourscript.pl
Perlスクリプトの上部近くに行を含めることができます。
use lib '..';
スクリプトを実行する前に、環境変数Perl5LIBを変更できます。
export Perl5LIB=$Perl5LIB:..
Push(@INC)戦略も機能しますが、モジュール検索の前にPushが実行されるようにするには、BEGIN {}でラップする必要があります。
BEGIN {Push @INC, '..'}
use yourlib;
おそらく、Pushが機能しなかった理由は、実行順序です。
use
はコンパイル時のディレクティブです。 Push
は実行時に行われます:
Push ( @INC,"directory_path/more_path");
use Foo.pm; # In directory path/more_path
BEGINブロックを使用して、この問題を回避できます。
BEGIN {
Push ( @INC,"directory_path/more_path");
}
use Foo.pm; # In directory path/more_path
IMO、最も明確であるため、use lib
に最適です:
use lib "directory_path/more_path";
use Foo.pm; # In directory path/more_path
BEGINおよびその他の特殊ブロックとそれらが実行されるタイミングについては、 perlmod を参照してください。
編集
スクリプト/ライブラリに関連するコードをロードするために、 File :: FindLib を強く推奨します
use File::FindLib 'my/test/libs';
と言って、スクリプトのパス内の任意の場所でライブラリディレクトリを検索できます。
あなたの仕事は次のように構成されているとしましょう:
/home/me/projects/
|- shared/
| |- bin/
| `- lib/
`- ossum-thing/
`- scripts
|- bin/
`- lib/
ossum-thing/scripts/bin
のスクリプト内:
use File::FindLib 'lib/';
use File::FindLib 'shared/lib/';
ライブラリディレクトリを見つけて、@INC
に追加します。
また、ツールスイートの実行に必要なすべての環境設定を含むモジュールを作成し、プロジェクト内のすべての実行可能ファイルにロードすることも役立ちます。
use File::FindLib 'lib/MyEnvironment.pm'
「use lib」は単一の文字列値をとることもできます...
#!/usr/bin/Perl
use lib '<relative-path>';
use <your lib>;
perlfaq8: から
プログラムが存在するディレクトリをモジュール/ライブラリ検索パスに追加するにはどうすればよいですか?
(brian d foyによる寄稿)
ディレクトリがすでにわかっている場合は、他のディレクトリの場合と同様に@INCに追加できます。コンパイル時にディレクトリがわかっている場合は、libを使用できます。
use lib $directory;
このタスクの秘Theは、ディレクトリを見つけることです。スクリプトが何か他のこと(chdirなど)を行う前に、Perlに付属しているCwdモジュールで現在の作業ディレクトリを取得できます。
BEGIN {
use Cwd;
our $directory = cwd;
}
use lib $directory;
スクリプト名を保持する$ 0の値でも同様のことができます。それは相対パスを保持するかもしれませんが、rel2absはそれを絶対パスに変えることができます。あなたが持ったら
BEGIN {
use File::Spec::Functions qw(rel2abs);
use File::Basename qw(dirname);
my $path = rel2abs( $0 );
our $directory = dirname( $path );
}
use lib $directory;
Perlに付属のFindBinモジュールが機能する可能性があります。現在実行中のスクリプトのディレクトリを見つけて$ Binに配置し、それを使用して正しいライブラリパスを構築できます。
use FindBin qw($Bin);
Eclipseでどのように実行できるかを説明します。私の開発システム-Windows 64ビット、Eclipse Luna、Eclipse用のPerlipseプラグイン、ストロベリーパールインストーラー。インタプリタとしてPerl.exeを使用します。
Eclipse>新しいPerlプロジェクトの作成>プロジェクトを右クリック>ビルドパス>ビルドパスの構成>ライブラリタブ>外部ソースフォルダーの追加>すべてのPerlモジュールがインストールされているフォルダーに移動> ok> okできた!
これまで誰も言及していなかったことに驚いていますが、 FindBin :: libs は、スクリプトの場所に関連するすべての合理的な場所を検索するため、常にライブラリを見つけます。
#!/usr/bin/Perl
use FindBin::libs;
use <your lib>;