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::Firefox
和 MozRepl
的程序也能正常工作。
问题显然已经缩小到 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}
我有一个 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::Firefox
和 MozRepl
的程序也能正常工作。
问题显然已经缩小到 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}