Как паковать приложения в AppImage за 5 команд.

В конце статьи есть раздел [КРАТКО][another], где только порядок действий для консоли.

AppImage Hub 800+ приложений!

AppImage  — формат для распространения переносимых приложений для Linux. Также пытается создать среду развёртывания дистрибутиво-независимых бинарных файлов, которая названа  Upstream . Впервые представлен как  klik  в 2004, в 2011 переименованный в  PortableLinuxApps  и в 2013, окончательно, в  AppImage .

Цели

AppImage стремится стать системой запуска приложений для Linux со следующими целями: простота, двоичная совместимость, независимость от дистрибутива, запуск без установки, запуск без прав суперпользователя, переносимость и сохранение операционной системы нетронутой.[6]

Свойства

AppImage не подразумевает под собой установку в привычном смысле этого слова. AppImage не размещает файлы приложения по системным папкам, а использует один сжатый файл. При запуске файла, он монтируется под FUSE. Это поведение сохранялось с самого начала существования проекта, и ранее использовалось в klik и PortableLinuxApps.

Каждое приложение самодостаточно: оно включает в себя все библиотеки, от которых зависит приложение. Стандарт AppImage 1.0 представлял собой iso-образ стандарта Rock Ridge (zisofs), включая в себя минимальный AppDir[en][7]и небольшую библиотеку среды выполнения. Вторая версия может использовать другие файловые системы, такие как SquashFS[8].

Лично я считаю это лучший способ распространять приложения, если вы еще не выросли до большого приложения которое всем нужно. Или распространяемое приложение проприетарно.

Инструкция

Итак это сайт отчасти про Vala, так что паковать будем ее, но это можно сделать практически с любым языком (или даже Wine, об этом будет ниже)

Вот офф wiki, где справа вы можете увидеть 29 гайдов по запаковке разного. Вот несколько примеров: GTK3, KDE, Java, Mono, .Net Core, Wine, Docker.

Существует проект от самого создателя AppImage который Сильно упрощает процесс запаковки, до буквально двух команд в терминале.

Вот его git, а вот отсюда мы качаем последнюю версию, да, оно тоже в .appimage

1) Напишем простейший hello world на Vala

И скомпилируем его в бинарник

Итак в папке 3 файла

2) Даем linuxdeployqt права на выполнение

3) Выполняем следующую команду:

./linuxdeployqt.AppImage console -bundle-non-qt-libs -unsupported-allow-new-glibc

Флаг  -bundle-non-qt-libs пакует все зависимости в текущую папку создавая так называемый AppDir который и превращается в .appImage файл после небольшого сжатия.

-unsupported-allow-new-glibc  длинная история, которую можно почитать здесь. Если вкратце то разраб AppImage хочет чтобы мы разрабатывали софт на «oldest still-supported Ubuntu LTS release», помойму это 14.04, аргументируя это тем что софт должен работать везде(AppImage не пакует glibc(по неизвестным мне причинам), версия которой и будет отличатся). Так что без этого флага вы получите ошибку о том что ваш дистр больно новый.

-unsupported-bundle-everything : Объединяет ВСЕ библиотеки зависимостей, вплоть до загрузчика ld-linux.so и glibc. Это позволит приложениям, созданным на более новых системах, работать на более старых, но это будет таксе, тк кк сильно увеличит вес .appimage.

Сейчас папка должна выглядеть вот так

4) Последнее что нужно сделать в терминале это ./linuxdeployqt.AppImage console -appimage -unsupported-allow-new-glibc

Что выдаст несколько ошибок, зато создаст все необходимые файлы: иконку и ярлык(ярлык я взял из набора иконок темы Suru).

Categories entry not found in desktop file .desktop file is missing a Categories= key

Далее приводим .desktop к следующему виду

Повторяем последнюю команду в терминале и получаем заветный Success

Ярлык появится в случае использования AppImageLauncher’а https://github.com/TheAssassin/AppImageLauncher который предложит интегрировать AppImage в систему при первом его запуске. Тогда его ярлык появится в меню приложений и на рабочем столе, с установленной нами иконкой.

Это уже кстати gtk приложение из https://vk.com/@valalanguage-longmathvala

Тест

Совет

Создайте виртуалку с Ubuntu 18.04 или даже 16.04 и пакуйте оттуда, это даст гарантию запуска на абсолютно всех дистрибутивах. Если размер для вас не критичен то используйте выше описанный флаг  -unsupported-bundle-everything

КРАТКО

wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage"

chmod a+x linuxdeployqt-continuous-x86_64.AppImage

./linuxdeployqt-continuous-x86_64.AppImage YourAppExecutable -bundle-non-qt-libs -unsupported-allow-new-glibc

./linuxdeployqt-continuous-x86_64.AppImage YourAppExecutable -appimage -unsupported-allow-new-glibc

Пофиксить .desktop и еще раз

./linuxdeployqt-continuous-x86_64.AppImage YourAppExecutable -appimage -unsupported-allow-new-glibc