Прочёл статью Дидье Роше (Didier Roche) и решил на её фоне рассказать вам чем живёт и дышит такой активно разрабатываемый проект как snap.
После того как научился паковать в snap пакет программы с помощью snapcraft на примере LanguageTool, решил взяться за другой проект не из мира Java, чтобы не ходить проторёнными дорожками.
Прежде мне хотелось прояснить вам один важный момент в мире snap. Snap - это самодостаточный пакет программы, но его английское определение self-contained может ложно намекать на аналогию с контейнерными технологиями, chroot, jail и т.д. А это не так! В пакете snap программа не обладает "своим" корнем / и своими копиями /etc/ или /usr/. И тут кроется тонкая грань, которая на практике выливается в геморрой при упаковке.
Итак, взял музыкальный плеер 0xDEADBEEF, написанный на языке С, использующий GTK тулкит для отрисовки UI.
В раздел parts добавил первый кусочек db.
parts: db: plugin: autotools source: deadbeef-0.7.2 configflags: - --prefix=/usr
Программа не сможет собраться, так как в сборочном сервере нет многих пакетов. По идее нужно добавить в кусочек db параметр build-package, но мне было реально влом читать INSTALL и выписывать оттуда имена пакетов, учитывая что у меня они могут чуток отличаться в имени. Решил воспользоваться шикарным трюком в мире Debian. Однократно зашёл в подпапку deadbeef-0.7.2/ и скомандовал
Если configure что-то не находит в системе для сборки, то auto-apt доустанавливает требуемое на лету. Кусочек db нужен для сборки и только.
sudo auto-apt update && auto-apt -y run ./configure
Теперь нужен кусочек для запихивания в snap всего того что нужно программе при работе. Кусочек назвал integration и используем ничего не делающий плагин nil. Всё таки пришлось читать INSTALL на предмет нужных пакетов-зависимостей для deadbeef.
integration: plugin: nil stage-packages: - libvorbis0a - libvorbisfile3 - ffmpeg - libmpg123-0 - libflac8 ...
И тут потянулись бесконечные дни по добавлению того, что нужно GTK программе в системе. В этом месте снапкрафтить было тяжело и совсем не весело. Грубо говоря, в системе нет того, к чему хотелось бы просто сделать коннект и получить всё на блюдечке с голубой каёмочкой. Разработчики обещают реализовать snap пакеты с runtime environment, но пока именно в виде snap нет. Но появилось облегчение в виде готовых, так называемых облачных кусочков (cloud parts). Вам достаточно добавить в свой кусочек ОДНУ волшебную строку
after: [desktop/xxx]
где xxx - gtk2, gtk3, qt4, qt5 или glib
Snapcraft однократно скачает лучшую реализацию данного тулкита и вам нет нужны использовать длинный список stage-packages. Спасибо хотя бы на этом. Мой stage-packages реально сократился и уменьшился мой враппер run.sh
apps: deadbeef: command: usr/bin/run.sh plugs: [home, unity7, network, network-bind, x11, gsettings, pulseaudio, mount-observe, locale-control]
Дело в том, что в snap пакете программа хранится в сжатом виде и не может писать в свой пакет (переменная $SNAP). Программа может писать только в ~/snap/, представленное переменной $SNAP_USER_DATA. Чтобы различные пути GTK переопределить в $SNAP_USER_DATA и требуется простыня команд на bash. Все копировали до сего момента эталонный враппер от разработчиков и получалось что снапкрафтеры делали одну и ту же работу. Теперь облачные кусочки принесли готовый эталонный враппер-обёртку в лице desktop-launch.
Получается что after: [desktop/xxx] помогает с улучшением интеграции программы, использующая тулкит ххх, с вашей системой и помогает снапкрафтеру сосредоточиться только на специфичных для данной программы местах.
Вот такой пример приводят разработчики на примере VLC, если снапкрафтер не справится сам с добавлением нужного (кадр слева) или просто добавив after: [desktop/xxx] (кадр справа). Идеального вида, как справа, можно добиться и без after: [desktop/xxx], только с ним проще.
В сам deadbeef пришлось внести правки, так как программы работают в тюрьмах и запихать в неё арестанта не просто . На данном этапе deadbeef работает в snap пакете со следующими временными ограничениями: интерфейс только GTK3, плагин для звука только PulseAudio. И на этом этапе решил последовать примеру Майкла Холла, который готовый snapcraft.yaml для Krita отправил авторам в upstream, не становясь при этом сопровождающим пакета как в мире deb. Связался с автором и сейчас решается как быть и что делать. По этому пока deadbeef не ищите в Ubuntu Store, но скоро он не заставит себя ждать и наконец-то такой замечательный проект будет доступен для установки в один щелчок через графический установщик Software для огромного количества пользователей.
Первый snap пакет. Java программа LanguageTool. sudo snap install languagetool
Третий snap пакет. Java программа TuxGuitar. sudo snap install tuxguitar-vs
Четвёртый snap пакет. Java программа Vuze. sudo snap install vuze-vs
Пятый snap пакет. Java программа osddm. sudo snap install osddm
Шестой snap пакет. PAC (Perl Auto Connector). sudo snap install pac-vs