Приветствую всех в продолжении темы, касающейся самодостаточного 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-пакет с сервисом и как его запустить и остановить.
Если есть вопросы или предложения, обращайтесь)
Спасибо всем.