BlinCT
BlinCT9 декабря 2018 г. 9:15

SNAP Урок 02. Пример снап пакета приложения основанного на Qt 5.11.0

Приветствую всех в продолжении темы, касающейся самодостаточного snap-пакета.
Прошло много времени с момента публикации предыдущей статьи, в которой я начал знакомить вас с технологией snap из своего опыта и применения. Вся вина времени, бизнеса и лени, конечно, тоже присутствовала)
Но мы сейчас продолжим тему)


Далее разберем эту технологию на примере моего приложения. Надо сказать, что он еще не полностью готов, но кое-что в нем работает. В нем переделывается некоторый функционал. Ниже по ссылке вы можете скачать его из моего дропбокса. Пока что приложения нет в официальном магазине, потому что оно еще не полностью готово.
В следующих статьях мы рассмотрим, как поставить приложение в магазин.

Структура проекта:

/
--scripts
----bin
------projecttimer
----Qt
--snap
----gui
----snapcraft.yaml

snap package

Установка приложения проста, перенос на компьютер и в консоль.
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

  1. strict - строгое ограничение безопасности ядра системы. Приложение не будет иметь доступа к системным интерфейсам, пользовательскому каталогу, сетевому доступу, аудиосистеме и так далее.
  2. devmode - режим отладки. Используется для разработчиков.
  3. классический - Приложение не имеет ограничений. Аналог - пакеты 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 пакета.
Возможно, вы спросите, как узнать обо всех зависимостях. Отвечу, есть несколько вариантов:

  1. ldd в консоли приложения и посмотреть, что оно хочет работать. Само собой, зависимости, которые он требует, будут иметь другие зависимости) да, весело дойти до конца)
  2. диск в цикле зависимостей и зависимостях зависимостей.
  3. использовать интересующего приложения linuxdeployqt

Вы скармливаете приложению бинарник, путь к либам, которые вы использовали для приложения (я про Qt) и эта программа выплюнет вам и qt, и system. Если не ошибаюсь, это приложение скоро будет в снапе. Так разработчику будет проще с ним работать.

В следующей статье мы обсудим, как настроить наше приложение, чтобы его уже можно было искать и запускать не только из консоли, но и из графики. Snap-пакет с сервисом и как его запустить и остановить.

Если есть вопросы или предложения, обращайтесь)
Спасибо всем.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
B

C++ - Тест 002. Константы

  • Результат:16баллов,
  • Очки рейтинга-10
B

C++ - Тест 001. Первая программа и типы данных

  • Результат:46баллов,
  • Очки рейтинга-6
FL

C++ - Тест 006. Перечисления

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии
k
kmssr8 февраля 2024 г. 18:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 1:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 10:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 8:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik18 декабря 2023 г. 21:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
P
Pisych27 февраля 2023 г. 4:04
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
Alexandru Codreanu19 января 2024 г. 11:57
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
BlinCT
BlinCT27 декабря 2023 г. 8:57
Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
Дмитрий
Дмитрий10 января 2024 г. 4:18
Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
Evgenii Legotckoi
Evgenii Legotckoi12 декабря 2023 г. 6:48
Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

Следите за нами в социальных сетях