Ссылка на предыдущую статью по данной теме:
Как была решена серьёзная проблема распространения софта для Linux в дистрибутиве Chimbalix
Installer-SH это установочный скрипт (или даже набор скриптов), позволяющий создавать автономные установочные пакеты приложений для дистрибутива Linux Chimbalix, среди особенностей можно выделить следующее:
- Возможность установки приложений только для одного пользователя, для чего root права не нужны.
- Возможность устанавливать приложения на автономных системах без доступа к интернету.
- Отличное сжатие благодаря формату 7-zip для упаковки файлов приложения, так же распаковка 7-zip архивов происходит быстрее аналогичных по сжатию tar.xz.
- Возможность установки разных версий одного и того же приложения, ведь Installer-SH использует отдельную стабильную категорию "apps" для расположения ярлыков.
- Есть возможность установки данных в домашний каталог пользователя, хотя этот функционал к использованию не рекомендуется, но иногда оно действительно нужно...
Конечно же есть и недостаток, мой скрипт не предназначен для приложений, что погрязли в "болоте зависимостей", хотя это сложно назвать недостатком...
Я уже опробовал версию 1.3, добавив несколько приложений в репозиторий:
https://github.com/Shedou/Chimbalix-Software-Catalog
Работает прекрасно:
А размер zip архива с установочным пакетом приложения почти в 2 раза меньше, чем то же самое приложение в формате AppImage, причём благодаря формату 7-zip, установка файлов происходит гораздо быстрее, чем если бы использовался линуксоидный вариант в виде tar.xz:
Вот небольшое сравнение, когда 7-zip распаковывает за 2 секунды, а tar.xz тратит на ту же работу целых 9 секунд времени (строка "real"):
Но были проблемы... Главная состояла в том, что мне приходилось вручную подготавливать каждый файл меню, а это рутинная и занудная работа, каждый файл переименовывать в соответствии с приложением:
Ещё был неприятный момент со сжатием файлов, 7-zip по умолчанию использует уровень сжатия 5 из 9, что даёт немного больший размер конечного файла, чем если сжимать с уровнем 7 из 9, ну а максимальный, девятый уровень сжатия требует значительно больше времени на упаковку, потому ещё думаю насчёт его использования, всё же с ним размер может быть значительно меньше, чем с седьмым уровнем, особенно если увеличить словарь до 128 МБ:
Можно конечно и больше увеличивать размер словаря, это положительно сказывается на сжатии, но не стоит забывать, что при словаре 128 МБ нужно минимум 128 МБ свободной ОЗУ для распаковки архива, это конечно не много, но для приложения размером 50 МиБ использовать размер словаря 1 ГБ совершенно нецелесообразно.
В общем, упаковка это не распаковка, один раз упаковать можно и потерпеть, так что обновляю параметры, и теперь скрипт упаковывает только существующие каталоги, в версии 1.3 он паковал без проверок:
Ещё разобрался с проблемой подготовки файлов меню, теперь большинство рутинной работы делает скрипт:
А мне, как упаковщику установочного пакета, остаётся только правильно разложить всё по своим местам используя шаблоны UNIQUE_APP_FOLDER_NAME и PATH_TO_FOLDER, что при подготовке файлов во время установки будут автоматически заменены:
Далее меня напрягали разбросанные по скрипту основные переменные, так же добавил комментарии и подсказки для удобства и отключил установку данных в домашний каталог пользователя, ведь эта возможность обычно не нужна, и раздражает что нужно постоянно выключать при создании новых установочных пакетов:
Единственное, я не могу перенести путь к шаблону файла удаления приложения, ибо он зависит от другой переменной, что зависит от режима установки, в норме конечно этот путь вообще трогать не надо, так что оставлю как есть:
Хм, нужно добавить уведомление на случай, если установка будет проходить в системном режиме, так же добавлена подсказка для отключения функции копирования данных в домашний каталог пользователя, вроде мелочи, но информируют пользователя о важных нюансах:
Так же был удалён мусор и добавлены строки с оформлением для некоторых событий:
Теперь сразу понятно, что установка завершилась успешно:
Надо поработать над скриптом удаления программы...
Отлично, так гораздо лучше:
Попутно были исправлены некоторые очепятки и пропущенные аргументы:
И на этом пожалуй хватит, пора бы проверить как оно в деле...
Начну с того, что перепакую старые приложения под новую версию скрипта:
Конечно, когда приложений будет много, так просто всё перепаковать не выйдет, и они останутся со старыми версиями скрипта, но сейчас это дело в стадии зарождения, и не вижу ничего зазорного в том, чтобы перепаковать первые версии на более качественные.
Буквально 5 минут потрачено на подготовку файлов, осталось упаковать и сравнить размер со старым способом упаковки:
Мне удалось сэкономить немного места перепаковав старый вариант, всего 8.2 МиБ, но это целых 7% от объёма архива:
Ну а в случае Blender v4.2.0, новый подход к сжатию позволил сэкономить уже существенные 39.8 МиБ (12.4%), или 54.9 МиБ (16.3%) относительно tar.xz формата, в котором распространяют приложение сами разработчики:
Да, бинарный файл 7-zip архиватора занимает дополнительные несколько мегабайт, так что мне стоило сравнить полный размер пакета, а не только часть с приложением, но с другой стороны, изначально приложение как раз в одном архиве распространяется, и не раскладывает ярлыки меню по своим местам, да и автоматически не распаковывается, так что всё правильно сравниваю.
Кстати, а что будет, если установить приложение как в систему, так и для одного пользователя одновременно?
На самом деле ничего страшного, система просто будет использовать в первую очередь то, что установлено именно у пользователя:
Хотя в случае вызова из терминала, без исправления косяка доставшегося по наследству от MX Linux дистрибутиву Chimbalix, использоваться будет конечно же системная версия, ну а с исправленным косяком версия пользователя, хотя в других случаях (вызов bin "ярлыка" в обход терминала), скорее всего, будет использоваться системная версия, ибо путь к пользовательской bin прописывается в пользовательском файле profile/bashrc, в общем линуксоидские дебри в стиле "всё не для людей"...
В любом случае хоть и есть нюансы, но ничего критичного, ибо ни один нормальный человек не будет вызывать приложение через терминал, когда можно это сделать через ярлык в меню "Пуск".
Ладно, удалим лишнее, этот деинсталлятор гораздо приятнее старого:
Осталось пожалуй только перевести Arduino IDE в новый формат установочного пакета, и тут я подумал... А ведь точно! Я забыл про разрядность приложений! Нужно будет в следующих версиях скрипта что-то с этим сделать, хотя можно просто в уникальное имя приложения добавить x86 - x86_64 и т.п...
Тут уже придётся задействовать функционал копирования данных в домашний каталог пользователя, ибо разработчики разорвали в клочья приложение, чтобы оно могло работать в вечно ущербных линуксах... Я не могу проигнорировать эти файлы, иначе приложение не сможет нормально работать без доступа к интернету...
Отлично:
Теперь каждое из этих приложений можно установить и удалить в любой момент, без характерного для линуксов идиотизма с зависимостями:
Как некоторые могли заметить, мой скрипт ничего не удаляет из домашнего каталога пользователя при удалении приложения, именно потому я настоятельно против использования функции установки данных в домашний каталог, но иногда она действительно необходима...
Единственное, меня немного напрягают иконки "uninstall" файлов, нужно будет создать универсальную иконку.
Ну и подумать над вероятностью того, что одно приложение может быть как 32 битным, так и 64 битным, и по-человечески разграничить их, а то сейчас такое не предусмотрено особо. Думаю неплохой идеей будет только 32 битный софт как-то особым образом выделять
Ладно, на этом можно завершить работу над Installer-SH версии 1.4.
Теперь создание адекватных установочных пакетов стало ещё проще, которые можно спокойно переносить хоть на флешке, и устанавливать даже на системы без доступа к интернету, и никакие в очередной раз умершие линуксоидские репозитории не повлияют ни на что.
Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.