Каков правильный вызов 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 необходимо установить на внешний компьютер, чтобы он заработал, и, в конечном итоге, попросить пользователя установить их вручную самостоятельно.


person user3046061    schedule 06.02.2014    source источник
comment
pp это, вероятно, путь. Если у вас возникли проблемы с его использованием, вероятно, было бы лучше показать нам сообщения об ошибках и т. д. — в идеале полный, минимальный и работоспособный пример, демонстрирующий вашу проблему. Тогда мы можем попытаться помочь вам в этом. Мы не можем помочь вам, указав на Magic::FairyWand модуль v0.42, который решит все ваши проблемы без дальнейших действий. усилий, потому что его не существует.   -  person amon    schedule 06.02.2014
comment
Моя проблема с его использованием заключается в том, что я не понимаю его использования. Да смешно я знаю. Учитывая структуру, которую я упомянул в операции, как бы я на самом деле запустил ее, чтобы хотя бы взглянуть на результат. Я попробовал очевидный pp -o bla.exe PerlApp.pl. Но я очень сомневаюсь, что это так, если только pp не просматривает этот каталог, что, как вы сказали, является желанием FairyWand.   -  person user3046061    schedule 06.02.2014
comment
Ах. Возможно, вы можете отредактировать свой вопрос, чтобы было более очевидно, что вы на самом деле спрашиваете: "Каков правильный вызов из pp, чтобы упаковать эту структуру каталогов — some command не сработало.» У меня нет необходимых знаний, чтобы ответить на этот вопрос, но вы можете облегчить задачу тем, кто умеет.   -  person amon    schedule 06.02.2014
comment
Без проблем. Я набрал более широкий вопрос в надежде получить больше информации.   -  person user3046061    schedule 06.02.2014


Ответы (1)


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

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