2009-10-01 56 views
1

我有perl模块文件和测试脚本pl,我用它来运行一些功能,并在browsing through the use libthis previous question here... 我仍然不知道如何做到这一点。如何强制Perl仅从测试目录运行模块?

基本上我有一个包含模块文件的生产目录,我有一个包含相同模块和测试脚本文件的测试目录文件。每次我尝试运行脚本文件时,它都会自动调用目录中的模块。通过打印出@INC,生产目录似乎托管在那里。因此,我尝试使用

no lib qw(prod_dir); 

将其删除,并同时打印出@INC显示该目录已经不存在,不知何故脚本仍在调用其他模块...

我大概知道这个听起来真的很愚蠢,但希望有人能帮助我看到这里的光:) 谢谢。

+0

'BEGIN {@ INC ='test'}'可能有效。 – 2009-10-01 17:24:45

回答

6

如果您有require d或use d模块,请检查%INC以查看它来自哪里。

例如:

use Data::Dumper; 
print $INC{'Data/Dumper.pm'}."\n"; 

注意 “::” 变为 “/” 你追加 “.pm的”。这可能会给你一个线索。

请记住,当前目录(“。”)通常是@INC中的一个条目。但第一步是找出模块从哪个目录加载。

要记住的另一件事是@INC中的目录是按顺序搜索。 use lib预先添加到该列表(使其成为第一个搜索的目录),因此您可能只需添加相应的目录即可。

2

你能说更多关于你想要做什么以及你如何去做的吗?这是东西在一个标准的Perl分布结构?如果你不使用标准的分布结构,你能向我们展示一个目录列表,这样我们就知道事物在哪里了吗?你还可以包含你用来加载模块的代码吗?当您将细节汇总在一起时,只需更新您的原始问题。

通常,我通过build runner运行测试,它会自动设置正确的@INC

如果我想运行在我分配一个测试,我用的是blib模块发现其中有我的模块的开发版本构建库:

% perl -Mblib t/test.t 

有些人做同样的事情与prove

如果您未使用基本分配设置,请考虑使用它。工具和最好的技术依赖于它。

如果您刚刚将模块和测试文件放在同一个目录中,您是否尝试过使用PERL5LIB将当前目录添加到@INC

+0

@Brian - 是的,这是mod perl,我们有一个目录,我们通常会存储我们正在使用的额外pm文件的其余部分。我想可能有一些循环依赖或在这里引起这个问题的东西:( – melaos 2009-10-06 08:03:16

相关问题