ern*_*nix 2 perl refactoring mocking require
我要重构大量旧的perl脚本.(超过150k行,没有测试,没有严格,没有包,没有提交日志,没有评论)
当我开始在t
目录下编写一些测试时.我发现几乎所有文件require
都是绝对路径.所以我尝试模拟内置require
函数使它们可移植,但没有运气:
use strict;
use warnings;
use Test::More;
use FindBin;
BEGIN {
my $root = "$FindBin::RealBin/../";
sub require {
$_[0] = $root . $_[0];
CORE::require(@_);
}
}
require_ok "foo.pl";
done_testing();
Run Code Online (Sandbox Code Playgroud)
上面的脚本给了我: Error: Can't locate foo.pl in @INC...
如何在Perl需要之前添加根路径?
谢谢Axeman,我使用以下钩子修改了绝对路径.
my $root = "$RealBin/../";
unshift @INC, sub {
my ($coderef, $filename) = @_;
$filename =~ s/^\///;
open(FILE, '<', $root . $filename);
return *FILE;
};
Run Code Online (Sandbox Code Playgroud)