2009-09-14 4 views
1

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

К сожалению, 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. 

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

+3

Опишите, какие параметры командной строки вы используете для сборки пакета. –

+1

Я использую скрипт для индивидуальной компиляции каждого файла pl в cgi. Я использую следующие аргументы командной строки: -I -X и -o – Jono

ответ

1

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

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

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

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

+1

Модуль :: ScanDeps 0.95 прибыл на CPAN. Ср http://search.cpan.org/dist/Module-ScanDeps/ – tsee

+1

Большое спасибо Штеффен, это совершенно ясно. – Jono

+1

Я также хотел бы указать, что pp -c должен выполняться в том же каталоге, что и скрипт, являющийся пакетом, или вы закончите с неправильным @INC (предположим, что вы включаете свои собственные модули perl, которые существуют в другом каталоге, и используя либо блок BEGIN, чтобы нажать @INC, либо модуль «use lib»). Это не давало мне никаких проблем при попытке использовать pp -c для упаковки моего сценария. – Jono

3

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

+0

Спасибо, Брэд. Я действительно прочитал документацию, и нигде в документации PAR Packer не указывает, что для создания автономного скрипта необходимы какие-либо определенные флаги. Фактически в документации четко указано: «pp создает автономные исполняемые файлы из программ Perl, используя сжатый пакет, предоставляемый PAR, и эвристику обнаружения зависимостей, предлагаемую модулем :: ScanDeps. Исходные файлы сжимаются дословно без компиляции». Это именно то, что я ищу, но, к сожалению, оно не работает. Есть идеи? – Jono

Смежные вопросы