Как я могу распространять приложение со многими исполняемыми файлами 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 также не составит труда.

Другие вопросы по тегам