Технология 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. Нам понадобится файл такого содержания:
Первые четыре строчки - это информация о самом пакете, название программы, версия и краткое и полное описание.
Command - это команда запуска программы, мы будем использовать скрипт warpper, потому, что нам нужно указать дополнительные переменные окружения.
plugs - это интерфейсы, которые может использовать программа. Дело в том, что программы snap работают в изолированной среде, откуда они не могут получить доступ к оборудованию и персональным данным. Чтобы наша программа могла нормально работать ей нужно дать доступ к интерфейсу opengl, unity7 и network.
Посмотреть доступные интерфейсы, и программ, которые их используют можно выполнив команду:
snap interfaces
В разделе parts мы указываем сами файлы программы. А если точнее, то что нужно сделать snapcraft при создании пакета. Поскольку нам ничего компилировать не нужно, мы будем использовать плагин copy, для копирования файлов. Файлы, которые нужно скопировать, перечислены в разделе files. Там есть не только исполняемые файлы, но и все необходимые библиотеки, так что программа получит все необходимые ей компоненты.
Формат записи такой:
Есть одна нестандартная запись:
Символ подстановки * позволяет скопировать весь каталог. Чтобы не копировать все файлы из системы, мы можем в секции site-packages сказать программе, какие пакеты следует установить в пакет snap, в нашем случае это libnss3 , fontconfig-config и gnome-themes-standard.
Чтобы посмотреть какие библиотеки использует программа, можно воспользоваться командой:
Обратите внимание, эти библиотеки поставляются вместе с программой, а поэтому нам нужно прописать их в конфигурационном файле 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.
Скажите, есть возможность использовать эту технологию в ОС KUBUNTU 14/04 LTS?
Нет, вам нужна только Ubuntu 16.04
Вы тралите человека вышЕ?
Насколько я знаю, Snap работает пока только в Ubuntu 16.04.
Вопрос.
Если компилировать проект не нужно, то как быть с проектами написанные например на qt, где все исходные тексты обрабатываются ещё мета компилятором, которого в сторонней системе попросту не будет?.
У snapcraft есть множество модулей, для различных языков программирования, в том числе есть и модуль qmake (правда его нужно доустанавливать)
Подскажите где можно почитать полную информацию о модулях и правила работы с ними?
Присоединяюсь к вопросу, где можно почитать подробно про сборку пакета для QT приложения? Или может вы бы статью написали с вариантом или собирать приложение в пакет или уже готовое скомпилированное упаковать в пакет. А то вот сейчас пытаюсь ради теста собрать и чет не все еще ясно с этим.
Об этом толком нигде не написано, в официальной документации я ничего внятного не обнаружил. Есть примеры на GitHub https://github.com/kyrofa/qt-example-snaps Но когда я пытался собрать программу она запускалась, но как-то криво и очень не красиво, насколько я понял у нее нет доступа к конфигурации gtk. Также есть один вопрос на askubuntu http://askubuntu.com/questions/791554/running-qml-c-application-build-with-cmake-is-unable-to-run-from-qtcreator-or Для себя я решил, что оно еще не готово и отложил сборку этих пакетов на будущее. Если разберетесь как заставить программы работать нормально - напишите.
Скажите, а где ты то вы находили полное описание интерфейсов, слотов и всего того что может быть в конфигурационном файле? Вот очень интересно каждый пункт узнать за что отвечает. А то даже как указал модуль qmake так он мне пишет про версию. А где это указывать, что указывать не понятно.
а чего dpkg не осилить что ли
И зачем оно нужно? Линуксоиды всегда ругали винду за то, что там каждая программа тянет свои библиотеки, часто дублирующие друг друга, а теперь сами идут по этому же пути?
нужно. однозначно. да конечно удобнее pacmanyaourt нет ничего )) но...линуксу пора уже перейти за какой то общеусвояемый вид пакета.
Чтобы установить локальный файл надо писать sudo snap install --devmode /path/to/*.snap file