1

我有一个WWW::Mechanize::Firefox在 windows 7 32bit 上使用草莓 perl 的 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,知道它可能是什么吗?

4

1 回答 1

2

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

如果依赖项是通过简单的“use”或“require”语句加载的,其中要加载的模块是文字字符串,则它可以处理,但如果模块是通过以下方式动态加载的,则它不会有太多机会:

require $myModuleToLoad;

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

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

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

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

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

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

unzip -l {parfile}
于 2015-03-24T09:57:40.673 回答