[英]Perl Par::Packer Can't find module issue
我有一個Perl程序,在帶有草莓perl的Windows 7 32bit上使用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
,知道這可能是什么嗎?
PAR :: Packer有時很難確定PAR軟件包中需要包含哪些模塊才能滿足您要打包的程序的所有要求。
如果依賴關系是通過普通的“ use”或“ require”語句加載的,那么可以解決問題,其中要加載的模塊是文字字符串,但是如果使用以下方式動態加載模塊,則機會不大:
require $myModuleToLoad;
瀏覽MozRepl和相關模塊的源代碼表明,它們大量使用了動態加載的插件。 我懷疑其中一些沒有包裝。
您可以通過為每個要添加的模塊在pp命令行中添加-M Module::Name
來手動指定要包含在PAR包中的模塊(將Module :: Name替換為實際的模塊名稱) 。
困難的部分可能是確定要包括哪些模塊。 一種方法是在腳本末尾臨時添加如下代碼:
END { print "$_ -> $INC{$_}\n" foreach sort keys %INC; }
然后正常運行腳本,而不是通過PAR。 它應該列出所有已加載的模塊。 您可以將其與PAR軟件包中的實際模塊進行比較,並使用-M
選項將缺失的模塊添加到pp。
通過使用7zip之類的解壓縮工具打開PAR文件,可以看到其內部的模塊。 或在Linux中:
unzip -l {parfile}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.