Perl Par :: Packer无法找到模块问题

时间:2015-03-24 02:48:51

标签: perl cpan strawberry-perl www-mechanize-firefox pp-perl-par-packager

我有一个perl程序,在带有草莓perl的Windows 7 32位上使用WWW::Mechanize::Firefox

使用命令C:\>perl testcase.pl可以正常工作。当我用C:\>pp -o testcase.exe testcase.pl编译它时,它编译没有错误。

当我运行testcase.exe时,它会给我错误:

Failed to connect to , Can't locate object method "setup" via package "MozRepl::Client" at MozRepl.pm line 224

我用于testcase.pl的代码是:

#!perl
use MozRepl;
use WWW::Mechanize::Firefox;
use warnings;
system('start firefox');
sleep(5);
$mech = WWW::Mechanize::Firefox->new;

另请注意,没有WWW::Mechanize::FirefoxMozRepl的程序可以正常运行。 问题显然已经缩小到PAR::Packer而不是MozRepl,不知道它可能是什么?

1 个答案:

答案 0 :(得分:2)

PAR :: Packer有时很难确定哪些模块需要包含在PAR包中,以满足您尝试打包的程序的所有要求。

如果依赖性是通过普通的'use'或'require'语句加载的,那么要加载的模块是一个文字字符串,但如果模块被动态加载某个东西,它就没那么多了。像:

require $myModuleToLoad;

浏览MozRepl及相关模块的源代码表明他们大量使用动态加载的插件。我怀疑其中一些没有打包。

您可以通过将-M Module::Name添加到要添加的每个模块的pp命令行来手动指定要包含在PAR包中的模块(将Module :: Name替换为实际的模块名称疗程)。

困难的部分可能是确定要包含哪些模块。一种方法是暂时将这样的内容添加到脚本的末尾:

END { print "$_ -> $INC{$_}\n" foreach sort keys %INC; }

然后正常运行你的脚本,而不是通过PAR。它应列出所有已加载的模块。您可以将其与PAR包中的实际模块进行比较,并使用-M选项将缺少的模块添加到pp。

您可以通过解压缩工具(如7zip)打开PAR文件中的模块。或者在Linux中:

unzip -l {parfile}