Может ли PAR Packer генерировать автономные скрипты? - PullRequest
1 голос
/ 15 сентября 2009

В настоящее время я использую 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? Я установил последнюю версию (0.994).

Ответы [ 2 ]

3 голосов
/ 15 сентября 2009

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

1 голос
/ 16 сентября 2009

Если вам нужен автономный скрипт, а не автономный двоичный файл (который является режимом по умолчанию для 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 в течение дня.

...