BlinCT
BlinCT9 декабря 2018 г. 10: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 хостинг.

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
d
  • dsfs
  • 26 апреля 2024 г. 14:56

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
d
  • dsfs
  • 26 апреля 2024 г. 14:45

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

  • Результат:50баллов,
  • Очки рейтинга-4
d
  • dsfs
  • 26 апреля 2024 г. 14:35

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

  • Результат:73баллов,
  • Очки рейтинга1
Последние комментарии
k
kmssr9 февраля 2024 г. 5:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 12:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 21:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 19:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 декабря 2023 г. 8:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
PS
Peter Son4 мая 2024 г. 3:57
Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
Evgenii Legotckoi
Evgenii Legotckoi3 мая 2024 г. 0:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 апреля 2024 г. 14:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
G
Gar22 апреля 2024 г. 15:46
Clipboard Как скопировать окно целиком в clipb?
Павел Дорофеев
Павел Дорофеев14 апреля 2024 г. 12:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь

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