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}
Другие вопросы по тегам