Как я могу распространять приложение со многими исполняемыми файлами perlapp, но распространять только один perl
Краткий вопрос
Должен ли я просто использовать perlapp - зависимый для каждого сценария perl, а затем убедиться, что я копирую perl-static в каталог bin приложения (вызывая его perl) во время сборки?
Фон
В настоящее время я распространяю приложение со многими автономными исполняемыми файлами perlapp, то есть каждый из них включает пакетную копию среды выполнения perl.
Я хотел бы распространять только одну копию среды исполнения perl в моем приложении, и каждый исполняемый файл ссылается на одну среду исполнения perl, которую я буду распространять.
Например, предположим, у меня есть 10 perl-скриптов, которые составляют мое приложение. Когда я выполняю perlapp для каждого из двух демонстрационных сценариев, я вижу что-то вроде этого:
+ ls -l
-rw-r--r-- 1 ----- staff 55 Feb 5 21:03 t1.pl
-rw-r--r-- 1 ----- staff 62 Feb 5 21:03 t2.pl
+ perlapp --force t1.pl
PerlApp 9.5.1 build 300018
Copyright (C) 1998-2016 ActiveState Software Inc. All rights reserved.
Commercial license for ..................................
Created 't1'
+ perlapp --force t2.pl
PerlApp 9.5.1 build 300018
Copyright (C) 1998-2016 ActiveState Software Inc. All rights reserved.
Commercial license for ..................................
Created 't2'
+ ls -l
-rwxr-xr-x 1 ----- staff 2266356 Feb 5 21:07 t1
-rw-r--r-- 1 ----- staff 55 Feb 5 21:03 t1.pl
-rwxr-xr-x 1 ----- staff 2026992 Feb 5 21:07 t2
-rw-r--r-- 1 ----- staff 62 Feb 5 21:03 t2.pl
ls -l `which perl`
-rwxr-xr-x 1 root wheel 1978336 Mar 19 2015 /usr/local/ActivePerl-5.20/bin/perl-static
В приведенном выше выводе вы можете видеть, что каждый из двух (пока у меня 10) исполняемых файлов занимает около 2Mib, по одному на каждый скрипт perl. В каждом из встроенных исполняемых файлов есть среда исполнения perl. Если бы я раздал все 10 из них, то распределение было бы более 22 МБ.
Кажется неряшливым и расточительным, чтобы заставить клиентов эффективно загружать среду исполнения perl 10 раз, когда приложению требуется только одна среда исполнения perl. Очевидно, что дистрибутив - это только один файл, но он намного больше, чем нужно. Хотя все приложение представляет собой только один исполняемый файл perlapp, среду выполнения perl удобно объединить в исполняемый файл. Но с течением времени добавляются функции (например, исполняемые файлы), и расточительность и небрежность возрастают.
Чтобы сделать это правильно, я уверен, что мне нужно использовать параметр командной строки --dependent perlapp. Когда я тестирую использование этой опции, я вижу огромное уменьшение размера прилагаемого исполняемого файла. После удаления временных папок и выполнения зависимого исполняемого файла похоже, что он объединяет те же модули, что и раньше.
Вот мои вопросы "как".
Q1 (безусловно, самый важный)
Если я добавлю параметр --dependent к своим командам perlapp, то стоит ли ожидать, что perlapp объединит все модули, которые он ранее связывал? Я думаю, что ответ здесь - "да", но я бы хотел, чтобы кто-то вроде Грэма Стюарта ответил.
Q2
Правда ли, что все, что мне нужно сделать, это убедиться, что статически связанный perl находится в переменной PATH, когда выполняются эти зависимые исполняемые файлы?
Q3 (Q2 перефразировано для дополнительного уточнения)
Perlapp связывает статически связанную версию perl? Я думаю, что это так, но, опять же, я хочу убедиться, что я делаю что-то эквивалентное.
PS
Я попытался опубликовать тему на форуме ActiveState на pdk, но я не думаю, что интерфейс принимает мое сообщение, потому что он показывает мое сообщение как неопубликованное без понятия о том, как его опубликовать.
Если я использую опцию --dependent, я вижу это:
+ perlapp --force --dependent t1.pl
PerlApp 9.5.1 build 300018
Copyright (C) 1998-2016 ActiveState Software Inc. All rights reserved.
Commercial license for ..................................
Created 't1'
+ perlapp --force --dependent t2.pl
PerlApp 9.5.1 build 300018
Copyright (C) 1998-2016 ActiveState Software Inc. All rights reserved.
Commercial license for ..................................
Created 't2'
+ ls -l
-rwxr-xr-x 1 ----- staff 108560 Feb 5 21:07 t1
-rw-r--r-- 1 ----- staff 55 Feb 5 21:03 t1.pl
-rwxr-xr-x 1 ----- staff 108608 Feb 5 21:07 t2
-rw-r--r-- 1 ----- staff 62 Feb 5 21:03 t2.pl
В приведенном выше выводе вы можете видеть, что файлы настолько малы, что они не могут быть связаны с исполняющей программой perl. Если я распространю perl-static и 10 из вышеперечисленных исполняемых файлов, то распределение будет около 3MiB, экономия около 19MiB.
Когда я удаляю PATH, исполняемые файлы вызывают ошибку, потому что исполняемый файл perl не найден. Вот почему я считаю, что дистрибутиву просто нужно, чтобы среда исполнения perl находилась в каталоге bin с исполняемыми файлами. Похоже, разумное решение, но так как я не писал perlapp, я не могу знать правду. Я должен положиться на кого-то другого, чтобы сказать мне: "Да, ты собираешься поступить правильно, и через 6 месяцев тебя не укусят, когда ты сделаешь х".
1 ответ
Не совсем то решение, которое вы ищете, но Win32:: Packer поддерживает эту функцию. Вы сообщаете ему набор сценариев, которые формируют ваше приложение, и он упаковывает их все в единый установщик MSI, содержащий все зависимости и .exe
обертки для всех скриптов.
В настоящее время он поддерживает только http://strawberryperl.com/, но добавить поддержку AS Perl также не составит труда.