BlinCT
09 грудня 2018 р. 21:15

Підручник із SNAP 02. Зразок пакета прив’язок програми на основі Qt 5.11.0

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


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

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

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

пакет snap

Установка програми проста, перенесення на комп'ютер та консоль.
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-пакет із сервісом і як його запустити та зупинити.

Якщо є питання чи пропозиції, звертайтесь)
Спасибі всім.

По статті запитували0питання

1

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up