Способы оплаты Abuse

Как создать Snap пакет Ubuntu 16

11.06.2021, 19:26

Snap - технология, разработанная специалистами Canonical с целью облегчения установки ПО в дистрибутиве Ubuntu. Она появилась относительно недавно. Разработка Snap происходила в течение нескольких лет, но только к релизу Ubuntu 16.04 появилась в состоянии, в котором она готова к использованию массовым пользователем. 

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

Создание Snap пакетов в Ubuntu 16.04

Для создания snap пакетов мы будем использовать специальный инструмент - Snapcraft. Это официальный инструмент для создания snap пакетов, который позволяет разработчику упаковывать программы для того, чтобы собирать необходимые файлы по всей системе. Snapcraft позволяет не только копировать файлы, но и скачивать исходники и собирать программу.

Дальше рассмотрим как создавать snap пакеты на примере приложения Samplenote.

Сначала установливаем Snapcraft. Чтобы получить самую новую версию добавим к нашей системе PPA:

$ sudo add-apt-repository ppa:snappy-dev/tools

Теперь обновим список пакетов и установим программу:

sudo apt-get update

$ sudo apt-get install snapcraft

Когда завершится установка Snapcraft можно переходить к получению исходников программы. Сначала скачаем исходники из GitHub и распакуем их:

$ wget https://github.com/Automattic/simplenote-electron/releases/download/v1.0.1/Simplenote-linux-x64.1.0.1.tar.gz
$ tar xvzf Simplenote-linux-x64.1.0.1.tar.gz

Поскольку программу не нужно компилировать наша задача немного облегчается. Переходим в папку с программой и инициализируем там окружение сборки Snapcraft:

$ cd Simplenote-linux-x64

$ snapcraft init

После выполнения последней команды, в папке появится файл snapcraft.yml. С помощью редактирования файла выполним настройку процесса создания нашего пакета snap. Нам понадобится файл такого содержания:

name: simplenote
version: 1.0.1
summary: The simplest way to keep notes.
description: The simplest way to keep notes. Light, clean, and free.
apps:
simplenote:
command: usr/bin/wrapper
plugs:
- unity7
- opengl
- network
parts:
simplenote:
plugin: copy
stage-packages:
- libnss3
- fontconfig-config
- gnome-themes-standard
files:
Simplenote: Simplenote
wrapper: usr/bin/wrapper
icudtl.dat: icudtl.dat
snapshot_blob.bin: snapshot_blob.bin
natives_blob.bin: natives_blob.bin
resources*: resources
libnode.so: usr/lib/x86_64-linux-gnu/libnode.so
libffmpeg.so: usr/lib/x86_64-linux-gnu/libffmpeg.so

Первые четыре строчки - это информация о самом пакете, название программы, версия и краткое и полное описание.

Command - это команда запуска программы, дальше станем использовать скрипт warpper, потому, что нам нужно указать дополнительные переменные окружения.

plugs - это интерфейсы, которые может использовать программа. Дело в том, что программы snap работают в изолированной среде, откуда они не могут получить доступ к оборудованию и персональным данным. Чтобы наша программа могла нормально работать ей нужно дать доступ к интерфейсу opengl, unity7 и network.

Посмотреть доступные интерфейсы, и программ, которые их используют можно выполнив команду:

snap interfaces

В разделе parts нужно указать файлы программы. Если быть точным, то что нужно сделать snapcraft при создании пакета. Поскольку нам ничего компилировать не нужно, задействуем плагин copy, для копирования файлов. Файлы, которые нужно скопировать, перечислены в разделе files. Там есть не только исполняемые файлы, но и все необходимые библиотеки, так что программа получит все необходимые ей компоненты.

Формат записи такой:

файл_в_системе: адрес_файла_в_пакете_snap

Есть одна нестандартная запись:

resources*: resources

Символ подстановки * позволяет скопировать весь каталог. Чтобы не копировать все файлы из системы, есть возможность в секции site-packages сказать программе, какие пакеты следует установить в пакет snap, в нашем случае это libnss3 , fontconfig-config и gnome-themes-standard.

Чтобы посмотреть какие библиотеки использует программа, можно воспользоваться командой:

ldd Simplenote | grep Simplenote

libnode.so => /home/sergiy/test/Simplenote/Simplenote-linux-x64/./libnode.so (0x00007f05fb477000)
libffmpeg.so => /home/sergiy/test/Simplenote/Simplenote-linux-x64/./libffmpeg.so (0x00007f05f61ec000)

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

Далее создадим файл wrapper:

!/bin/sh
export FONTCONFIG_PATH=$SNAP/etc/fonts
export FONTCONFIG_FILE=$SNAP/etc/fonts/fonts.conf
export XDG_DATA_HOME=$SNAP/usr/share
export LD_LIBRARY_PATH=$SNAP_LIBRARY_PATH:$SNAP/usr/lib/x86_64-linux-gnu/
exec "$SNAP/Simplenote" "$@"

Здесь все просто - скрипт на Bash. Устанавливаем пути для шрифтов, и указываем программе где нужно искать библиотеки, чтобы libnote.so и libffmpeg.so были успешно найдены. А последняя строка запускает на выполнение simplenote.

Дальше осталось сделать этот файл исполняемым:

$ chmod +x wrapper

Для начала сборки пакета выполните:

$ snapcraft

Сборка может занять кое-какое время, а после завершения сборки вы сможете установить пакет:

$ sudo snap install simplenote_1.0.1_amd64.snap

Для запуска программы вы можете воспользоваться обычной командой:

$ simplenote

Теперь программа установлена. Точно такой же способ создания snap пакетов вы можете использовать для упаковки своих приложений.