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