Snap - технологія, розроблена фахівцями Canonical з метою полегшення встановлення програмного забезпечення в дистрибутиві Ubuntu. Вона з'явилася відносно недавно. Розробка Snap відбувалася протягом кількох років, але тільки до релізу Ubuntu 16.04 з'явилася в стані, в якому вона готова до використання масовим користувачем.
Головна перевага Snap полягає в можливості встановити програми без залежностей. Усі потрібні бібліотеки знаходяться вже в пакеті з програмою і для її запуску нічого не потрібно від системи. Під час оновлення користувачеві залишається оновити один snap-пакет, не вносячи змін до системи, а в разі збоїв і помилок можна відкотити пакет до попередньої версії. У мережі часто можна наштовхнутися на суперечки серед користувачів з приводу того, чи справді хороша технологія snap, чи потрібно від неї відмовитися на користь deb
пакетів. Але все це покаже час і тестування. Далі в цій статті розглянемо процес створення snap
пакетів. Створювати їх трохи простіше, ніж ті ж самі deb
пакети.
Для створення 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
. Там є не тільки виконувані файли, а й усі необхідні бібліотеки, тож програма отримає всі необхідні їй компоненти.
Формат запису такий:
system_file: snap_package_file_path
Є один нестандартний запис:
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-пакетів
ви можете використовувати для пакування своїх додатків.