Perl — еще раз о деплое
Perl является скриптовым языком, с невозможностью компиляции в машинные коды, которые могли бы непосредственно выполняться на процессоре. Это создает проблему развертывания приложения на компьютере конечного пользователя. Еще сильнее эту проблему усугубляет присутствие в вашем приложении модулей из CPAN: заставить работать модуль на любой системе порой бывает проблематично.
Существует 3 подхода для решения этой проблемы:
— установка Perl на компьютере конечного пользователя, установка зависимостей приложения(как правило через установочный скрипт);
— использование инструментов вроде PAR, Perl2exe, ActiveState PDK, которые пакуют приложение, его модули, и сам интерпретатор perl в самодостаточный exe файл, который может быть запущен на другой машине;
— компромисс между первыми двумя методами — использование PAR для формирования списка зависимостей, создание дистрибутива из вашего приложения и его зависимостей, который представляет из себя просто папку со скриптом и библиотеками. Последняя может быть распространена в виде архива, инсталлятора на базе, например, NullSoft Installer.
Первый метод очевиден, второй же достаточно хорошо расписан в интернете. При этом оба из них имеют недостатки в виде сложности развертывания(первый метод) и очень медленного запуска приложения(метод 2). Оба эти недостатка заставили меня всерьез задуматься о третьем методе, недостаточно хорошо освещенном в интернете.
В качестве примера создадим простую GUI-утилиту, использующую Tk, так, чтобы она могла работать на любой машине с Windows и не требовала бы установки Perl.
1. Установка Perl на девелоперской машине
Наилучший выбор среди дистрибутивов для Windows — Strawberry Perl, ввиду того, что с ним идет компилятор С, позволяющий собирать довольно большую часть модулей CPAN. Рекомендуемая версия — 5.16.
2. Установка необходимых модулей
Через командную строку запускаем cpan и ставим необходимые модули. В нашем случае это Tk и Par::Packer. Модуль Tk ставится просто и обычно без проблем:
install Tk
К сожалению PAR::Packer в данной версии имеет ошибку, из-за которой он не собирается на большинстве систем. Устанавливать его нужно так:
install PAR::Packer
Вы получите ошибку вида:
windres -F pei-i386 -i winrespp.rc -o winrespp.res
windres -o ppresource.coff winrespp.res
windres: unexpected version string length 68 != 32 + 8
dmake: Error code 129, while making 'ppresource.coff'
dmake.exe: Error code 255, while making 'subdirs'
RSCHUPP/PAR-Packer-1.013.tar.gz
C:strawberrycbindmake.exe -- NOT OK
Для того, чтобы установить модуль перейдите в директорию C:strawberrycpanbuild, там вы увидите директорию вида PAR-Packer-1.013-29nhQP, перейдите в нее. В ней находится распакованный код модуля Par::Packer, сейчас мы внесем исправления, чтобы сборка прошла успешно. Зайдите в поддиректорию myldrwinres, откройте файл pp.rc. В оригинальном виде файл имеет следующее содержимое:
// pp.RES is created using Microsoft toolchain rc
//
// rc pp.rc
#define PP_MANIFEST_FILEFLAGS 0
#include <windows.h>
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "pp.manifest"
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,0,0,0
PRODUCTVERSION 0,0,0,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS PP_MANIFEST_FILEFLAGS
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "000004B0"
BEGIN
VALUE "CompanyName", " "
VALUE "FileDescription", " "
VALUE "FileVersion", "0.0.0.0"
VALUE "InternalName", " "
VALUE "LegalCopyright", " "
VALUE "LegalTrademarks", " "
VALUE "OriginalFilename", " "
VALUE "ProductName", " "
VALUE "ProductVersion", "0.0.0.0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x00, 0x04B0
END
END
WINEXE ICON pp.ico
Удалите лишние строки, чтобы файл принял такой вид:
// pp.RES is created using Microsoft toolchain rc
//
// rc pp.rc
#define PP_MANIFEST_FILEFLAGS 0
#include <windows.h>
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "pp.manifest"
Теперь вернитесь в директорию PAR-Packer-1.013-29nhQP и выполните там команды:
dmake
dmake install
Теперь модуль установлен и можно перейти к созданию дистрибутива приложения.
3. Создания дистрибутива приложения
В качестве примера возьмем следующую простую программу Hello world.
use Tk;
use utf8;
my $mw = new MainWindow;
my $label = $mw -> Label(-text=>"Привет") -> pack();
my $button = $mw -> Button(-text => "Пока",
-command => sub { exit })
-> pack();
MainLoop;
Теперь запакуем скрипт вместе с зависимостями:
pp -B -p test.pl
В результате получим файл a.par. По сути, это обыкновенный ZIP-архив, в котором лежит наш скрипт и зависимости. В архиве нам понадобится только папка lib, распакуйте ее, например, в C:testapp. Туда же скопируйте наш скрипт test.pl. Теперь нужно скопировать в эту папку интерпретатор perl и нужные для его запуска dll. Для этого нужно скопировать из директории C:strawberryperlbin файлы:
libgcc_s_sjlj-1.dll
libstdc++-6.dll
perl.exe
perl516.dll
В итоге нужно получить директорию следующего содержания:
12.08.2012 23:06 <DIR> lib
11.04.2012 19:23 96 256 libgcc_s_sjlj-1.dll
11.04.2012 19:23 829 440 libstdc++-6.dll
09.08.2012 10:04 16 384 perl.exe
09.08.2012 10:04 16 384 wperl.exe
09.08.2012 10:04 1 458 176 perl516.dll
12.08.2012 23:05 256 test.pl
Остался лишь последний штрих — нужно добавить в дистрибутив сам модуль PAR, поскольку утилита pp при составлении списка зависимостей не учитывает сам модуль PAR. Для этого скопируйте в директорию C:testapplib следующие объекты из директории C:strawberryperlvendorlib:
12.08.2012 19:57 <DIR> PAR
02.12.2011 14:15 39 863 PAR.pm
Теперь у вас в директории C:testapp находится готовое к запуску приложение. Для чистоты эксперимента, чтобы быть уверенным, что установленный на машине strawberry perl и его библиотеки не смогут участвовать в запуске нашего приложения. Для этого переименуйте директорию C:strawberry в C:strawberry_hide. Теперь можно перейти в директорию C:testapp и запустить приложение при помощи команды:
perl test.pl
4. Итоги
Мы получили директорию с нашим приложением, которую можно перенести на любую другую систему при помощи простого копирования. При желании можно создать инсталлятор, или распространять приложение в архиве. Удаленное выполнение из расшареной через Netbios папки не рекомендуется — очень низкая скорость загрузки.
Чтобы ваше приложение удобно запускалось, создайте ярлык для perl.exe(или wperl.exe, если не хотите, чтобы при запуске появлялось окно консоли) с параметром в виде вашего скрипта. Теперь осталось только вынести ярлык на рабочий стол, и программа готова к использованию.
Автор: PerlPower