Авторские статьи

Улучшения в snapcraft. Пакуем DeaDBeeF.


Прочёл статью Дидье Роше (Didier Roche) и решил на её фоне рассказать вам чем живёт и дышит такой активно разрабатываемый проект как snap.

После того как научился паковать в snap пакет программы с помощью snapcraft на примере LanguageTool, решил взяться за другой проект не из мира Java, чтобы не ходить проторёнными дорожками.

Прежде мне хотелось прояснить вам один важный момент в мире snap. Snap - это самодостаточный пакет программы, но его английское определение self-contained может ложно намекать на аналогию с контейнерными технологиями, chroot, jail и т.д. А это не так! В пакете snap программа не обладает "своим" корнем / и своими копиями /etc/ или /usr/. И тут кроется тонкая грань, которая на практике выливается в геморрой при упаковке.

Итак, взял музыкальный плеер 0xDEADBEEF, написанный на языке С, использующий GTK тулкит для отрисовки UI.

deadbeef

В раздел parts добавил первый кусочек db.

parts:
 db:
  plugin: autotools
  source: deadbeef-0.7.2
  configflags:
   - --prefix=/usr

Программа не сможет собраться, так как в сборочном сервере нет многих пакетов. По идее нужно добавить в кусочек db параметр build-package, но мне было реально влом читать INSTALL и выписывать оттуда имена пакетов, учитывая что у меня они могут чуток отличаться в имени. Решил воспользоваться шикарным трюком в мире Debian. Однократно зашёл в подпапку deadbeef-0.7.2/ и скомандовал
sudo auto-apt update && auto-apt -y run ./configure
Если configure что-то не находит в системе для сборки, то auto-apt доустанавливает требуемое на лету. Кусочек db нужен для сборки и только.

Теперь нужен кусочек для запихивания в 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 пришлось внести правки, так как программы работают в тюрьмах и запихать в неё арестанта не просто . На данном этапе 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

Дата последней правки: 2016-11-29 14:33:19

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта