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

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

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


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

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

  1. /
  2. --scripts
  3. ----bin
  4. ------projecttimer
  5. ----Qt
  6. --snap
  7. ----gui
  8. ----snapcraft.yaml

snap package

Установка приложения проста, перенос на компьютер и в консоль.
sudo snap install —dangerous <имя пакета>
Очень важный нюанс, приложение не будет работать в системе, если у вас карта AMD и установлены проприетарные драйвера. Проблема с либдрм. Это сейчас решается, но пока ситуация имеет такой вид.

  1. name: managetime
  2. version: "0.1.0"
  3. summary: timer
  4. description: |
  5. Application for time management
  6. confinement: strict
  7. grade: stable
  8. architectures: [amd64]
  9.  
  10. base: core18
  11.  
  12. apps:
  13. managetime:
  14. command: bin/projecttimer
  15. plugs:
  16. - home
  17. - unity7
  18. - x11
  19. - opengl
  20. - pulseaudio
  21. - wayland
  22. - network
  23. - desktop
  24. - desktop-legacy
  25. environment:
  26. XDG_RUNTIME_DIR: /run/user/1000
  27. __EGL_VENDOR_LIBRARY_DIRS: $SNAP/etc/glvnd/egl_vendor.d:$SNAP/usr/share/glvnd/egl_vendor.d
  28. # XKB config
  29. XKB_CONFIG_ROOT: $SNAP/usr/share/X11/xkb
  30. # Qt Platform to Wayland
  31. #QT_QPA_PLATFORM: wayland
  32. QT_QPA_PLATFORM: xcb
  33. QTCHOOSER_NO_GLOBAL_DIR: 1
  34. QT_SELECT: snappy-qt5
  35. # Qt Modules
  36. LD_LIBRARY_PATH: $SNAP/Qt/5.11.0/gcc_64/lib:$LD_LIBRARY_PATH
  37. QT_PLUGIN_PATH: $SNAP/Qt/5.11.0/gcc_64/plugins
  38. QML2_IMPORT_PATH: $QML2_IMPORT_PATH:$SNAP/Qt/5.11.0/gcc_64/qml
  39. QT_QPA_PLATFORM_PLUGIN_PATH: $SNAP/Qt/5.11.0/gcc_64/plugins/platforms
  40. # XDG Config
  41. XDG_CONFIG_DIRS: $SNAP/etc/xdg:$SNAP/usr/xdg:$XDG_CONFIG_DIRS
  42. XDG_DATA_DIRS: $SNAP/usr/share:$XDG_DATA_DIRS
  43. # Font Config and themes
  44. FONTCONFIG_PATH: $SNAP/etc/fonts/conf.d
  45. FONTCONFIG_FILE: $SNAP/etc/fonts/fonts.conf
  46. # Tell libGL where to find the drivers
  47. LIBGL_DRIVERS_PATH: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/dri
  48. parts:
  49. managetime:
  50. plugin: dump
  51. source: scripts
  52. source-type: local
  53. build-attributes:
  54. - keep-execstack
  55.  
  56. integration:
  57. plugin: nil
  58. stage-packages:
  59. - libc6
  60. - zlib1g
  61. - libstdc++6
  62. - libgcc1
  63. - libglib2.0-0
  64. - libpcre3
  65. - libxext6
  66. - libx11-6
  67. - libxcb1
  68. - libxau6
  69. - libxdmcp6
  70. - libbsd0
  71. - libxdamage1
  72. - libxfixes3
  73. - libx11-xcb1
  74. - libxcb-glx0
  75. - libxcb-dri3-0
  76. - libxcb-present0
  77. - libxcb-dri2-0
  78. - libxxf86vm1
  79. - libxshmfence1
  80. - libxcb-sync1
  81. - libpulse-mainloop-glib0
  82. - libpulse0
  83. - libsystemd0
  84. - liblzma5
  85. - liblz4-1
  86. - libgcrypt20
  87. - libgpg-error0
  88. - libwrap0
  89. - libsndfile1
  90. - libflac8
  91. - libogg0
  92. - libvorbis0a
  93. - libvorbisenc2
  94. - libasyncns0
  95. - libdbus-1-3
  96. - libfontconfig1
  97. - libfreetype6
  98. - libpng16-16
  99. - libexpat1
  100. - libxi6
  101. - libxrender1
  102. - libdrm2
  103. - libwayland-client0
  104. - libwayland-cursor0
  105. - libffi6
  106. - libxkbcommon0
  107. - libxcomposite1
  108. - libgl1
  109. - libgl1-mesa-dri
  110. - libgl1-mesa-glx
  111. - libdrm-common
  112. - libtinfo5

Начнем с краткого описания:
confinement: в настоящее время имеет 3 режима ограничений, строгий, классический и devmode

  1. strict - строгое ограничение безопасности ядра системы. Приложение не будет иметь доступа к системным интерфейсам, пользовательскому каталогу, сетевому доступу, аудиосистеме и так далее.
  2. devmode - режим отладки. Используется для разработчиков.
  3. классический - Приложение не имеет ограничений. Аналог - пакеты deb, об/мин. То есть приложение имеет доступ к системе без ограничений.

base: core18 — Приложение основано на core18, отвечающем за интерфейсы в системе и приложениях.

Приложения: - часть конфигурации приложения
managetime: - название приложения в системе (например, в консоли при поиске)

команда: bin/projecttimer — что будет называться по имени (managetime). Также есть вариант разместить скрипт перед бинарником, если перед запуском приложения нужно что-то сделать в системе.

Плагины: - плагины, которые будет использовать приложение. Вскоре пользователь увидит на рабочем столе во время установки окно, в котором он увидит, куда будет лазить приложение и что оно будет делать в системе. Упрощение понимания функционала.

Есть плагины, которые подключаются автоматически, но есть и такие, которые нужно подключать вручную.

Среда: - настройка среды. Вы можете поместить это в сценарий bash и сделать что-то вроде этого.
команда: myconfig.sh bin/projecttimer
но я привел его сюда, так как проще посмотреть, что находится в настройках окружения.

  1. parts:
  2. managetime:
  3. plugin: dump
  4. source: scripts

Это все вместе говорит о том, что вам нужно сделать сборку приложения, например, скомпилировать из исходников, а значит у вас будет плагин: cmake, qmake или другой вариант.
В моем случае все копируется из каталога scripts и помещается в package. Он содержит как сам бинарник приложения, так и необходимый Qt

  1. integration:
  2. plugin: nil
  3. stage-packages:

вот это самое интересное, в этой части мы указываем какие пакеты и их версии нужны для работы приложения и выносим их в изоляцию от самого snap пакета.
Возможно, вы спросите, как узнать обо всех зависимостях. Отвечу, есть несколько вариантов:

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

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

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

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

По статье задано0вопрос(ов)

1

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

Комментарии

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