如何在不同的目录中包含Perl模块?它需要是包含它的模块的相对路径。
我试过
push ( @INC,"directory_path/more_path");
也
push ( @INC,"directory_path\\more_path");
答案 0 :(得分:68)
编辑:首先提供正确的解决方案,最初来自this question。它是唯一一个相对于模块目录进行搜索的人:
use FindBin; # locate this script
use lib "$FindBin::Bin/.."; # use the parent directory
use yourlib;
还有许多其他方法可以搜索相对于当前目录的库。您可以使用-I参数调用perl,传递另一个模块的目录:
perl -I.. yourscript.pl
您可以在perl脚本的顶部附近添加一行:
use lib '..';
您可以在运行脚本之前修改环境变量PERL5LIB:
export PERL5LIB=$PERL5LIB:..
推送(@INC)策略也可以工作,但它必须包含在BEGIN {}中,以确保在模块搜索之前运行推送:
BEGIN {push @INC, '..'}
use yourlib;
答案 1 :(得分:14)
推送无效的原因很可能是执行顺序。
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'
答案 2 :(得分:10)
'use lib'也可以采用单个字符串值...
#!/usr/bin/perl
use lib '<relative-path>';
use <your lib>;
答案 3 :(得分:7)
如何将我的程序所在的目录添加到模块/库搜索路径?
(由brian d foy提供)
如果您已经知道该目录,则可以像在任何其他目录中一样将其添加到@INC。如果在编译时知道目录,则可以使用lib:
use lib $directory;
此任务的技巧是找到目录。在脚本执行任何其他操作(例如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);
答案 4 :(得分:0)
我很惊讶之前没有人提到它,但是FindBin::libs总会找到你的libs,因为它会搜索相对于你脚本位置的所有合理位置。
#!/usr/bin/perl
use FindBin::libs;
use <your lib>;
答案 5 :(得分:0)
我会告诉你如何在日食中完成它。我的开发系统 - Windows 64bit,Eclipse Luna,用于eclipse的Perlipse插件,草莓珍珠安装程序。我使用perl.exe作为我的翻译。
Eclipse&gt;创建新的perl项目&gt;右键单击项目&gt;构建路径&gt;配置构建路径&gt;库标签&gt;添加外部源文件夹&gt;转到安装所有perl模块的文件夹&gt;好的&gt;好。完成!