我有一个perl程序,它在windows 7 32位上使用WWW::Mechanize::Firefox
和草莓perl。
它与命令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
,你知道这可能是什么吗?
标准杆数::Packer有时很难确定哪些模块需要包含在标准杆数包中,以满足您试图打包的程序的所有要求。
如果依赖关系是通过简单的"use"或"require"语句加载的,其中要加载的模块是一个文字字符串,它可以处理,但如果模块是用以下内容动态加载的,它就没有太大机会了:
require $myModuleToLoad;
浏览MozRepl和相关模块的源代码表明,它们大量使用动态加载的插件。我怀疑其中一些没有包装。
您可以手动指定要包含在标准杆数包中的模块,方法是将-M Module::Name
添加到要添加的每个模块的pp命令行中(当然,将模块::名称替换为实际模块名称)。
最困难的部分可能是确定要包括哪些模块。一种方法是在脚本末尾临时添加这样的内容:
END { print "$_ -> $INC{$_}n" foreach sort keys %INC; }
然后正常运行脚本,而不是通过标准杆数。它应该列出所有加载的模块。您可以将其与标准杆数包中的实际模块进行比较,并使用-M
选项将缺失的模块添加到第页
您可以通过使用解压工具(如7zip)打开标准杆数文件来查看其中的模块。或者在Linux中:
unzip -l {parfile}