Приветствую всех в продолжении темы, касающейся самодостаточного snap-пакета.
Прошло много времени с момента публикации предыдущей статьи, в которой я начал знакомить вас с технологией snap из своего опыта и применения. Вся вина времени, бизнеса и лени, конечно, тоже присутствовала)
Но мы сейчас продолжим тему)
Далее разберем эту технологию на примере моего приложения. Надо сказать, что он еще не полностью готов, но кое-что в нем работает. В нем переделывается некоторый функционал. Ниже по ссылке вы можете скачать его из моего дропбокса. Пока что приложения нет в официальном магазине, потому что оно еще не полностью готово.
В следующих статьях мы рассмотрим, как поставить приложение в магазин.
Структура проекта:
/ --scripts ----bin ------projecttimer ----Qt --snap ----gui ----snapcraft.yaml
Установка приложения проста, перенос на компьютер и в консоль.
sudo snap install —dangerous <имя пакета>
Очень важный нюанс, приложение не будет работать в системе, если у вас карта AMD и установлены проприетарные драйвера. Проблема с либдрм. Это сейчас решается, но пока ситуация имеет такой вид.
name: managetime version: "0.1.0" summary: timer description: | Application for time management confinement: strict grade: stable architectures: [amd64] base: core18 apps: managetime: command: bin/projecttimer plugs: - home - unity7 - x11 - opengl - pulseaudio - wayland - network - desktop - desktop-legacy environment: XDG_RUNTIME_DIR: /run/user/1000 __EGL_VENDOR_LIBRARY_DIRS: $SNAP/etc/glvnd/egl_vendor.d:$SNAP/usr/share/glvnd/egl_vendor.d # XKB config XKB_CONFIG_ROOT: $SNAP/usr/share/X11/xkb # Qt Platform to Wayland #QT_QPA_PLATFORM: wayland QT_QPA_PLATFORM: xcb QTCHOOSER_NO_GLOBAL_DIR: 1 QT_SELECT: snappy-qt5 # Qt Modules LD_LIBRARY_PATH: $SNAP/Qt/5.11.0/gcc_64/lib:$LD_LIBRARY_PATH QT_PLUGIN_PATH: $SNAP/Qt/5.11.0/gcc_64/plugins QML2_IMPORT_PATH: $QML2_IMPORT_PATH:$SNAP/Qt/5.11.0/gcc_64/qml QT_QPA_PLATFORM_PLUGIN_PATH: $SNAP/Qt/5.11.0/gcc_64/plugins/platforms # XDG Config XDG_CONFIG_DIRS: $SNAP/etc/xdg:$SNAP/usr/xdg:$XDG_CONFIG_DIRS XDG_DATA_DIRS: $SNAP/usr/share:$XDG_DATA_DIRS # Font Config and themes FONTCONFIG_PATH: $SNAP/etc/fonts/conf.d FONTCONFIG_FILE: $SNAP/etc/fonts/fonts.conf # Tell libGL where to find the drivers LIBGL_DRIVERS_PATH: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/dri parts: managetime: plugin: dump source: scripts source-type: local build-attributes: - keep-execstack integration: plugin: nil stage-packages: - libc6 - zlib1g - libstdc++6 - libgcc1 - libglib2.0-0 - libpcre3 - libxext6 - libx11-6 - libxcb1 - libxau6 - libxdmcp6 - libbsd0 - libxdamage1 - libxfixes3 - libx11-xcb1 - libxcb-glx0 - libxcb-dri3-0 - libxcb-present0 - libxcb-dri2-0 - libxxf86vm1 - libxshmfence1 - libxcb-sync1 - libpulse-mainloop-glib0 - libpulse0 - libsystemd0 - liblzma5 - liblz4-1 - libgcrypt20 - libgpg-error0 - libwrap0 - libsndfile1 - libflac8 - libogg0 - libvorbis0a - libvorbisenc2 - libasyncns0 - libdbus-1-3 - libfontconfig1 - libfreetype6 - libpng16-16 - libexpat1 - libxi6 - libxrender1 - libdrm2 - libwayland-client0 - libwayland-cursor0 - libffi6 - libxkbcommon0 - libxcomposite1 - libgl1 - libgl1-mesa-dri - libgl1-mesa-glx - libdrm-common - libtinfo5
Начнем с краткого описания:
confinement: в настоящее время имеет 3 режима ограничений, строгий, классический и devmode
- strict - строгое ограничение безопасности ядра системы. Приложение не будет иметь доступа к системным интерфейсам, пользовательскому каталогу, сетевому доступу, аудиосистеме и так далее.
- devmode - режим отладки. Используется для разработчиков.
- классический - Приложение не имеет ограничений. Аналог - пакеты deb, об/мин. То есть приложение имеет доступ к системе без ограничений.
base: core18 — Приложение основано на core18, отвечающем за интерфейсы в системе и приложениях.
Приложения: - часть конфигурации приложения
managetime: - название приложения в системе (например, в консоли при поиске)
команда: bin/projecttimer — что будет называться по имени (managetime). Также есть вариант разместить скрипт перед бинарником, если перед запуском приложения нужно что-то сделать в системе.
Плагины: - плагины, которые будет использовать приложение. Вскоре пользователь увидит на рабочем столе во время установки окно, в котором он увидит, куда будет лазить приложение и что оно будет делать в системе. Упрощение понимания функционала.
Есть плагины, которые подключаются автоматически, но есть и такие, которые нужно подключать вручную.
Среда: - настройка среды. Вы можете поместить это в сценарий bash и сделать что-то вроде этого.
команда: myconfig.sh bin/projecttimer
но я привел его сюда, так как проще посмотреть, что находится в настройках окружения.
parts: managetime: plugin: dump source: scripts
Это все вместе говорит о том, что вам нужно сделать сборку приложения, например, скомпилировать из исходников, а значит у вас будет плагин: cmake, qmake или другой вариант.
В моем случае все копируется из каталога scripts и помещается в package. Он содержит как сам бинарник приложения, так и необходимый Qt
integration: plugin: nil stage-packages:
вот это самое интересное, в этой части мы указываем какие пакеты и их версии нужны для работы приложения и выносим их в изоляцию от самого snap пакета.
Возможно, вы спросите, как узнать обо всех зависимостях. Отвечу, есть несколько вариантов:
- ldd в консоли приложения и посмотреть, что оно хочет работать. Само собой, зависимости, которые он требует, будут иметь другие зависимости) да, весело дойти до конца)
- диск в цикле зависимостей и зависимостях зависимостей.
- использовать интересующего приложения linuxdeployqt
Вы скармливаете приложению бинарник, путь к либам, которые вы использовали для приложения (я про Qt) и эта программа выплюнет вам и qt, и system. Если не ошибаюсь, это приложение скоро будет в снапе. Так разработчику будет проще с ним работать.
В следующей статье мы обсудим, как настроить наше приложение, чтобы его уже можно было искать и запускать не только из консоли, но и из графики. Snap-пакет с сервисом и как его запустить и остановить.
Если есть вопросы или предложения, обращайтесь)
Спасибо всем.