Perl Par::Packer 找不到模块问题

Perl Par::Packer Can't find module issue

我有一个 perl 程序,它在 windows 7 32 位上使用 WWW::Mechanize::Firefox with strawberry 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::FirefoxMozRepl 的程序也能正常工作。 问题显然已经缩小到 PAR::Packer 不喜欢 MozRepl,知道它可能是什么吗?

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

如果依赖项是通过普通 'use' 或 'require' 语句加载的,其中要加载的模块是文字字符串,它可以处理,但如果模块正在动态加载类似:

require $myModuleToLoad;

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

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

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

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

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

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

unzip -l {parfile}