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

Технология Snap разработанная в Canonical для облегчения установки программного обеспечения в дистрибутиве Ubuntu появилась совсем недавно. Она разрабатывалась на протяжении последних нескольких лет, но только к релизу 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 пакетов вы можете использовать для упаковки своих программ.

Выводы

Несмотря на то, что snap довольно спорная технология, ее уже используют многие разработчики программ, в том числе разработчики популярного браузера Firefox. Если вы разрабатываете свое программное обеспечение, то вполне можете создать snap пакеты. Учитывая, что snap скоро будет поддерживать и другие дистрибутивы, то это вполне неплохая затея. Более подробную информацию вы можете получить в официальной документации по snapcraft.



2016-06-20T12:38:01
Программирование