Может ли PAR Packer генерировать автономные скрипты?

В настоящее время я использую PAR Packer (pp), чтобы упаковать пару сценариев pl так, чтобы они могли быть скопированы на компьютер и "просто работать" без необходимости перехватывать мой клиент с CPAN.

К сожалению, PAR Packer не работает для глубоких зависимостей. Например, скрипт импортирует CHI::Driver::File, но явно не импортирует Log::Any::Adapter::Null, который требуется для CHI::Driver::File. PAR не распознает эту зависимость, и при запуске сгенерированного скрипта произойдет следующее сообщение об ошибке:

Can't locate Log/Any/Adapter/Null.pm in @INC (@INC contains: CODE(0x874aab8) /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc/lib /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc CODE(0x87e8f54) CODE(0x87e9194)) at (eval 215) line 3.
Compilation failed in require at CHI/Driver/File.pm line 11.
BEGIN failed--compilation aborted at CHI/Driver/File.pm line 11.

Мой обходной путь должен явно импортировать "Log::Any::Adapter::Null", но должен быть лучший способ. Возможно, это ошибка в PAR Packer? Я установил последнюю версию (0.994).

2 ответа

Решение

Если вам нужен автономный скрипт, а не автономный двоичный файл (который является режимом по умолчанию для pp), добавьте параметр -P. Я бы посоветовал против этого, хотя. Это наименее проверенный режим работы.

Также обратите внимание, что PAR::Packer работает для глубоких зависимостей. Тема вашего вопроса немного претенциозна. Фактически, PAR::Packer на самом деле не проверяет никаких зависимостей, а делегирует это Module::ScanDeps. Теперь Module::ScanDeps является эвристическим подходом к сканированию зависимостей, и его можно сломать, вызвав уродливую динамическую загрузку зависимостей. (т.е. генерирование имен модулей во время выполнения и последующее использование их в eval).

Действительно, если вы посмотрите на источники для Log:: Any (который используется CHI::Driver::File), вы быстро увидите, что он использует динамическую загрузку модулей. Вот почему модуль:: Adapter:: Null не берется.

В общем, мы исправляем эти проблемы, добавляя специальный модуль в Module::ScanDeps для таких модулей, автор которых считает, что было бы неплохо победить любой вид статического анализа. Пока вы не получите фиксированную версию Module::ScanDeps, вы можете использовать параметры -c или -x для pp, чтобы разрешение зависимости использовало компиляцию или выполнение программы вместо того, чтобы полагаться только на статический анализ. Расширенный модуль Module::ScanDeps имеет версию 0.95 и должен быть доступен из CPAN в течение дня.

Ну, вы читали документацию? Он предоставляет ряд параметров командной строки для включения зависимостей и даже возможность принудительно включать модули вручную.

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