Не устану повторять что snap идеально подходит стороннему программисту, который хочет представить своё детище широкому кругу пользователей, но ввязываться в геморрой с дичайшей фрагментацией linux экосистемы он, по понятным причинам, не хочет. Ко мне обратился один из таких разработчиков - Сергей Чудаков ака CSRedRat.
Мы сторговались с Сергеем, что помогу с созданием snapcraft.yaml и объяснением по шагам что и почему делалось, но наработки он продолжит сам и сам будет выкладывать в Snap Store без дополнительной сущности в моём лице. Вся суть snap, в противовес deb, не стоять, как сопровождающий, между программистом и пользователем. Платой за мою работу будет вот эта статья.
Итак, мы захотели запаковать topalias. Linux bash/zsh alias generator and statistics from command history, written on Python.
Сначала знакомимся с проектом topalias. Видим в разделе Installation инструкции по сборке и всё это может и умеет snapcraft. Сам стащит проект с git, сам "откомпилит", но по ряду причин у меня не получилось, так как мало опыта в упаковке программ на Python. Хотя разработчики snap выкладывают в разделе документация массу информации, в том числе и как паковать программы на питоне.
Решил схитрить, так как в гит проекта даже написано как запустить topalias без установки.
git clone https://github.com/CSRedRat/topalias
python3 topalias/topalias/cli.py -h
Поэтому пока готов вам показать "облегчённую версию" snapcraft.yaml. Мы просто упакуем готовое! В принципе данный метод имеет право на жизнь.
Итак. Нужна пустая папка и установленный инструмент snapcraft. По логике можно и нужно на сборочном сервере установить топовую Ubuntu LTS, но, по ряду причин, у меня пока Ubuntu 18.04 LTS.
Делаем в пустой папке git clone https://github.com/CSRedRat/topalias
Рождается каталог topalias/, будем работать внутри её. Создаём подпапку topalias/snap/ и там файл snapcraft.yaml. Создаём подпапку topalias/snap/gui/, чтобы дальнейшем размещать там desktop файлы и т.д. В папку topalias/topalias/ где лежит cli.py подкладываем стартовый исполняемый скрипт topalias_snap.sh
В итоге у нас должно получиться примерно так
├── snap/ │ ├── gui/ │ └── snapcraft.yaml ├── topalias/ │ ├── aliascore.py │ ├── cli.py │ ├── data/ │ ├── __init__.py │ ├── __main__.py │ ├── py.typed │ └── topalias_snap.sh
Содержимое исполняемого скрипта topalias_snap.sh, который будет представлен "как бинарник" в будущем snap пакете.
#!/bin/bash
export PATH="$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu"
export LD_LIBRARY_PATH="$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH=$SNAP_LIBRARY_PATH:$LD_LIBRARY_PATH
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
# Run python script
python3 $SNAP/cli.py $@
echo "Report you great ideas and any feedback: https://github.com/CSRedRat/topalias/issues/new"
Теперь объясняю построчно snapcraft.yaml, который упакует topalias/topalias/ в snap пакет. Официальная документация.
name: topalias
Имя проекта. Должно быть заранее зарегистрировано и это будет задачей Сергея!
Снапкрафтер посещает официальный сайт и резервирует в Store себе имя. В особо "тяжёлых" случаях нужно будет доказать владение таким названием и, возможно, получить отказ. Не сталкивался с подобным, но нужно быть готовым. Если был получен отказ в имени, то придётся изменить snapcraft.yaml и отразить изменения в имени.
https://snapcraft.io/snaps
https://dashboard.snapcraft.io/stores/snaps/
version: "1.0-snap1"
Любое название согласно документации. Люблю версия + снап_подверсия если мало ли будут выпуски исправленных пакетов снап на эту же версию программы.
summary: topalias
Краткое описание.
description: |
Linux bash/zsh alias generator and statistics from command history, written on Python.
Длинное название.
confinement: devmode
Ограничение пока, к сожалению, devmode, так как не знаю как получить доступ к скрытым файлам в домашней директории. Дело в том, что будем просить подключить к интерфейсу home, но он даёт фильтрованный доступ к домашней папке пользователя (allows access to non-hidden files owned by the user in the user’s home). В будущем, нужно спросить опытных разработчиков snap как лучше поступить, так как пока выходом является указание ограничение как devmode, а не strict. НИКОГДА не заливал в Snap Store пакеты в devmode и нет опыта, Сергею придётся этот вопрос решить при заливке пакета в Snap Store.
grade: stable
Уровень качества выставлен stable, хотя до конца не дожата тема с confinement. В любом случае, при заливке готового пакета в Snap Store можно будет позже указать на каком уровне качества вы хотели бы опубликовать пакет. Поэтому не стоит в данном месте зацикливаться.
architectures: [amd64]
Пакую только в 64 бита. Есть возможность сделать multiarch .. не делал!
base: core18
Пока базой считаю ubuntu-core 18.04 и с ней меня "состыкуют". По идее можно переходить на core20.
apps:
topalias:
command: topalias_snap.sh
plugs: [ home ]
Секция apps - "исполняемые бинарники". Как минимум должен быть один "бинарник" и должен совпадать с именем пакета. Когда пользователь запускает topalias, то он неявно просит запустить topalias.topalias. Если внутри пакета несколько бинарников, то они должны запускаться явно имя_пакета.имя_бинарника Обратите внимание что указание стартового скрипта topalias_snap.sh идёт без использования пути к нему. В идеале, нужно писать путь в виде $SNAP/path/to/file, но ниже станет понятно, как работает эта "магия". Из множества различных интерфейсов просим подключить лишь к home, так как topalias программа консольная.
parts:
topalias-files:
plugin: dump
source: topalias/
after: [integration]
integration:
plugin: nil
stage-packages:
- python3
- python3-click
- locales
stage:
- -usr/share/doc/*
- -usr/share/man/*
Сделал 2 кусочка-части (parts)
Когда вы запускаете snapcraft в папке вашего проекта, он считывает файл snap/snapcraft.yaml и начинает обрабатывать кусочки integration и topalias-files, каждый из которых проходит этапы pull -> build -> stage. Мне вам легко и просто дать готовое, но когда сам делал первую итерацию упаковки, то получил ошибку, которую бы Сергей, как автор, не допустил бы. Я, не являясь автором программы и опытным разработчиком на Питоне, забыл добавить пакет python3-click. После добавления python3-click в секцию stage-packages, получил ругань при старте программы - бла-бла-бла click бла-бла-бла locales.
Добавил строки
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
в стартовый topalias_snap.sh.
После мытарств, рано или поздно родится snap пакет. Для тестирования автору в систему нужно устанавливать sudo snap --dangerous --devmode topalias*.snap
. Ключом --dangerous вы соглашаетесь что осознаёте факт установки не подписанного пакета в систему.
Публикация пакета подробно описана в статье Releasing your app. Нужно залогиниться в Snap Store snapcraft login
и залить пакет на нужный вам уровень надёжности. Пример показывает заливку на канал stable - snapcraft upload --release=stable имя-пакета.snap
.
Пакет должен пройти вереницу тестов и будет подписан ключом автора. После этого программа станет доступна пользователям через установку в Терминале, GNOME Software, KDE Discover и в различных магазинах софта, которые умеют работать со Snap Store.
Как сказано выше, из-за специфики topalias, который работает со скрытыми файлами, к которым доступ из пакета снап фильтруется, мы не соблюли условие ограничение strict и использовали confinement: devmode, что может повлечь не допущение в Snap Store. Данные вопросы придётся разрулить Сергею самостоятельно, так как, меня как лишней сущности, нет в процессе - автор заливает свой софт для пользователей. Сергею останется заполнить для удобства пользователей различные опциональные поля, залить картинки-скриншоты и т.д. В дальнейшем, Сергей может всё изменить по своему усмотрению в snapcraft.yaml. Перейти от упаковки готового к сборке-упаковке. Инструмент snapcraft гибок и позволяет различными путями достигнуть результата.
Ускорение процесса упаковки snap.
Snap vs Deb.
Мои snap пакеты.