如何包含位于不同目录中的Perl模块?
如何包含位于不同目录中的Perl模块? 它需要是包含它的模块的相对path。
我试过了
push ( @INC,"directory_path/more_path");
也
push ( @INC,"directory_path\\more_path");
编辑:把正确的解决scheme,原来从这个问题 。 这是唯一一个相对于模块目录进行search的地方:
use FindBin; # locate this script use lib "$FindBin::Bin/.."; # use the parent directory use yourlib;
search与当前目录相关的库有许多其他方法。 您可以使用-I参数调用perl,传递另一个模块的目录:
perl -I.. yourscript.pl
您可以在perl脚本的顶部附近添加一行:
use lib '..';
在运行脚本之前,您可以修改环境variablesPERL5LIB:
export PERL5LIB=$PERL5LIB:..
推(@INC)策略也可以工作,但必须将其包装在BEGIN {}中以确保在模块search之前运行该推送:
BEGIN {push @INC, '..'} use yourlib;
你推动不起作用的原因很可能是执行顺序。
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
国际海事组织,这是最清楚的,因此最好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';
在path的脚本上方的任何位置查找库目录。
说你的工作是这样构build的:
/home/me/projects/ |- shared/ | |- bin/ | `- lib/ `- ossum-thing/ `- scripts |- bin/ `- lib/
在ossum-thing/scripts/bin
的脚本里面:
use File::FindLib 'lib/'; use File::FindLib 'shared/lib/';
将find你的图书馆目录,并将其添加到您的@INC
。
创build一个包含运行套件所需的全部环境设置的模块,并将其加载到项目中的所有可执行文件中也是非常有用的。
use File::FindLib 'lib/MyEnvironment.pm'
'使用lib'也可以采取单个string值…
#!/usr/bin/perl use lib '<relative-path>'; use <your lib>;
来自perlfaq8:
如何将我的程序所在的目录添加到模块/库searchpath?
(由布莱恩福伊提供)
如果您已经知道该目录,则可以将其添加到@INC,就像您对其他目录一样。 如果您在编译时知道该目录,则可以使用lib:
use lib $directory;
这个任务的诀窍是find目录。 在脚本执行任何其他操作(如chdir)之前,可以使用Perl自带的Cwd模块获取当前的工作目录:
BEGIN { use Cwd; our $directory = cwd; } use lib $directory;
您可以使用$ 0的值来执行类似的操作,该值包含脚本名称。 这可能会保持一个相对path,但rel2abs可以把它变成一个绝对path。 一旦你有了
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模块可能工作。 它find当前正在运行的脚本的目录,并将其放入$ Bin中,然后可以使用它来构build正确的库path:
use FindBin qw($Bin);
我很惊讶之前没有人提到它,但FindBin :: libs将始终find您的库,因为它在相对于您的脚本的位置的所有合理的地方进行search。
#!/usr/bin/perl use FindBin::libs; use <your lib>;
我会告诉你如何在eclipse中完成。 我的开发系统 – Windows 64bit,Eclipse Luna,用于eclipse的Perlipse插件,草莓珍珠安装程序。 我使用perl.exe作为我的解释器。
Eclipse>创build新的Perl项目>右键单击项目>构buildpath>configuration构buildpath>库选项卡>添加外部源文件夹>转到所有perl模块安装的文件夹>确定>确定。 完成!