Каков правильный вызов pp для упаковки этой структуры каталогов?

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

Настройка такова: у меня есть приложение с несколькими модулями, которым я хочу поделиться с кем-то, работающим на Windows, с установленным дистрибутивом Strawberry Perl.

Структура этого примерно такая:

PerlApp
 lib
   Base
     Base.pm
     Gui.pm
   Db
     Db.pm
     records.db
   Parser
     Parser.pm
   Utils
     Utils.pm
 PerlApp.pl
 Config.txt

Все это имеет две точки входа. Я могу запустить его либо через интерфейс командной строки cmd со скриптом PerlApp.pl, либо запустить файл Gui.pm, содержащий для него интерфейс Wx.

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

Я пробовал pp, но исполняемый файл, полученный в результате упаковки сценария cmd, приводит к различным ошибкам. Я ознакомился с документацией, но на всю жизнь я не могу понять, как использовать этот модуль для упаковки полного дерева каталогов или даже если это поддерживается. (синдром документации телефонной книги)

Я старался

pp -o app.exe PerlApp.pl

Ошибки:

The locale codeset (cp1252) isn't one that perl can decode, stopped at Encode/Locale.pm line 94
Compilation failed in require at LWP/UserAgent.pm line 1000
Compilation failed in require at lib/Base/Base.pm line 9

Последнее решение - это упаковка всех необходимых файлов и выяснение того, какие модули CPAN необходимо установить на внешнем компьютере, чтобы заставить его работать, и, в конечном счете, обращение к пользователю с просьбой установить их вручную.

1 ответ

Раньше у меня была похожая ошибка, связанная с кодировкой (или кодовой страницей в Windows), когда я упаковывал скрипт на Perl. Я везде гуглил, но прямого ответа не нашел, но в конце концов понял сам.

  1. На самом деле модуль Encode способен декодировать cp1252, реальная проблема в том, что Encode::Locale определяет соответствующую кодировку в RUNTIME, но PP просто добавляет необходимые зависимости во время компиляции (если можно так выразиться). Так что вам нужно добавить -x опция в команде для добавления зависимостей во время выполнения.
  2. избежать Encode::Locale полностью. Даже если вы упакуете необходимый декодер pm в свой исполняемый файл, при запуске его в другой системе с другой кодировкой произойдет похожая ошибка. Я предлагаю вам узнать, какая строка вашего кода использует Encode::Locale и найти обходной путь.
Другие вопросы по тегам