Perl Par::Packer Не удается найти проблему с модулем
У меня есть Perl-программа, которая использует WWW::Mechanize::Firefox
на windows 7 32bit с клубничным перлом.
Работает нормально с командой 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
Любая идея, что это может быть?
1 ответ
PAR::Packer иногда трудно определить, какие модули необходимо включить в пакет PAR, чтобы выполнить все требования программы, которую вы пытаетесь упаковать.
Он отлично справляется, если зависимости загружаются с помощью простых операторов 'use' или 'require', где загружаемый модуль является литеральной строкой, но у него не будет большого шанса, если модуль загружается динамически с чем-то вроде:
require $myModuleToLoad;
Просмотр исходного кода MozRepl и связанных с ним модулей показывает, что они интенсивно используют плагины, загружаемые динамически. Я подозреваю, что некоторые из них не упаковываются.
Вы можете вручную указать модули, которые будут включены в пакет PAR, добавив -M Module::Name
в командной строке pp для каждого из модулей, которые будут добавлены (замена Module::Name на фактическое имя модуля, конечно).
Сложной частью может быть определение того, какие модули включить. Один из способов сделать это - временно добавить что-то вроде этого в конец вашего скрипта:
END { print "$_ -> $INC{$_}\n" foreach sort keys %INC; }
затем запустите ваш скрипт нормально, а не через PAR. В нем должны быть перечислены все модули, которые были загружены. Вы можете сравнить это с фактическими модулями, присутствующими в пакете PAR, и добавить недостающие, используя -M
вариант на стр.
Вы можете увидеть модули внутри вашего файла PAR, открыв его с помощью инструмента для разархивирования, такого как 7zip. Или в Linux:
unzip -l {parfile}