Компилировать Perl-скрипт (включая модули), используя PAR::Packer

Я знаю, что это некрасиво, но мне нужно скомпилировать Perl-скрипт на Windows для клиента, поэтому в основном я пытаюсь сделать.exe из моего.pl-скрипта.

Я использую PAR::Packer, установленный через cpan, и я успешно скомпилировал несколько простых скриптов.

Раньше все работало нормально, но теперь не работает, так как я добавил use Text::CSV;

Это работает, но когда я запускаю.exe, он выдает эту ошибку:

Can't locate Text/CSV_PP.pm in @INC (@INC contains: CODE(0x25f1f84) C:\Users\user
\AppData\Local\Temp\par-6b6f6e74757a\cache-6d4baa68e36871e6407210ca47953c635f
81e612\inc\lib C:\Users\user\AppData\Local\Temp\par-6b6f6e74757a\cache-6d4baa6
8e36871e6407210ca47953c635f81e612\inc CODE(0x239f2ec) CODE(0x239f67c)) at (eval
18) line 2.
 at script/csvutil.pl line 5.
Compilation failed in require at script/csvutil.pl line 5.
BEGIN failed--compilation aborted at script/csvutil.pl line 5.

В основном то, что я делаю, это:

pp -o csvutil.exe csvutil.pl

Я попытался добавить модули принудительной загрузки:

pp -M Text::CSV csvutil.pl

Я думаю, что что-то упустил...

Я работаю с клубникой Perl 5.16

Начало кода:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Text::CSV;

my $file = $ARGV[0];
my @rows;
my $csv = Text::CSV->new ( { binary => 1 ,sep_char => ",",allow_loose_quotes => 1, eol=> $/, always_quote =>1 } )  # should set binary attribute.
             or die "Cannot use CSV: ".Text::CSV->error_diag ();

     ...# basically print all the lines

3 ответа

Решение

Text::CSV на самом деле просто интерфейс. Он автоматически определяет, какой внутренний модуль использовать: либо чисто Perl Text::CSV_PP, либо XS (код C) Text::CSV_XS. PAR обнаруживает статическую зависимость от Text::CSV, но не может разрешить динамическую зависимость. Измени свой -M возможность включить либо Text::CSV_XS или Text::CSV_PP. Связать версию XS, если она у вас установлена. Это намного быстрее.

Там может быть проблема с путем в @INC, Возможно, вы найдете ответ здесь

Я бы предложил отойти от PAR и использовать Cava Packager. В прошлом я пользовался PAR, и мне не хватало или нет, получу ли я когда-либо упакованное приложение. Похоже, он не очень хорошо обрабатывает определенные модули, и когда вы сталкиваетесь с ним, он не может справиться с ресурсами, которые редки, а исправления обычно являются грязными хаки. Приложения Gtk+/Tk действительно доставляют PAR трудное время.

Cava Packager, с другой стороны, очень надежен, активно поддерживается и способен обрабатывать все модули, которые я к нему добавляю. Это позволяет вам / сообществу создавать правила о том, как обрабатывать особые случаи для конкретных модулей. Любые проблемы, с которыми я столкнулся, были быстро решены с помощью активного списка рассылки. Он предоставляет графический интерфейс для настройки параметров проекта. Он поддерживает InnoSetup для автоматического создания установщика при упаковке вашего приложения. Он активно поддерживается и в настоящее время работает над тем, чтобы стать открытым исходным кодом. Пока я не нашел Cava Packager, я почти отказался от идеи упаковки сценариев Perl в качестве исполняемого файла для распространения. Cava превзошел все ожидания, которые я установил после использования PAR и ActiveState perl2exe. Может показаться, что я разработчик для Cava, но на самом деле это не так! Просто ОЧЕНЬ СЧАСТЛИВЫ с этим.

Я знаю, что это не совсем отвечает на поставленный вами вопрос, но это решает вашу проблему, и я подумал, что вы можете найти Cava столь же полезным, как и я.

Другие вопросы по тегам