Perl — еще раз о деплое

в 18:44, , рубрики: deployment, perl, Песочница, метки: ,

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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js