我有一个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::Firefox
和MozRepl
的程序可以正常运行。
问题显然已经缩小到PAR::Packer
而不是MozRepl
,不知道它可能是什么?
答案 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}