Прикладной программист не против предоставить своё детище для пользователей Linux, но связываться с дичайшей фрагментацией линукс экосистемы, удовольствие сомнительное. Действовать через сопровождающих - это долго и медленно. Поднимать свой репозиторий - накладно. Snap действительно может быть отличным выходом для программиста, предложив ему свой Snap Store. От программиста требуется лишь создать snap пакет и залить его в хранилище. В данной статье от разработчика Canonical Кайла Фаззари (Kyle Fazzari aka kyrofa) речь пойдёт как сделать весь процесс быстрее!
Любой кто делал первые шаги в упаковке софта с помощью инструмента snapcraft мог заметить, что в целом это всё долго и медленно. Snap пакет содержит все зависимости программы, которые на этапе сборки нужно стащить (fetch) и распаковать (unpack), а учитывая, что в файле snapcraft.yaml автором программы создаются различные части-кусочки (parts), каждую из которых нужно собрать и сделать частью будущего пакета snap. По завершению первой итерации сборки в snap, нужно установить получившийся snap пакет и протестировать работу. Как только вы заметите ошибку и поймёте что всё работает не так как вы задумали, то придётся внести изменения и снова пройти через этот длительный процесс.
Часто процесс упаковки программы в snap формат выглядит так:
1) В папке сборочного процесса запускается инструмент snapcraft, который считывает ваши указания из файла snap/snapcraft.yaml и начинает обрабатывать кусочки (parts), скачивая (fetch) и собирая (build) все зависимости для создания итогового snap. Это может занять много времени.
2) Установка snap пакета для проверки.
3) Осознание что что-то пошло не так.
4) Исправление кода (стартового скрипта, конфигурационных параметров и т.д.)
5) Запуск snapcraft снова.
6) В зависимости от версии snapcraft происходит одно из двух: до версии 2.34 ваши изменения ничего не меняют и создаётся такой же не устраивающий вас snap пакет; более новые версии выдают ошибку - "Эй, исходный код изменён". Последний вариант может показаться вам не менее раздражающим, но, поверьте мне, такое развитие ситуации лучше! Чуть позже будет объяснено почему.
7) В результате п.п 6 разработчик запускает snapcraft clean
и возвращается к п.п 1
Стоп. Есть способы лучше!
Допустим вы только что закончили шаг 4. Если вы запустите snapcraft clean
, то удалите всё что сделал snapcraft. Все зависимости, которые были распакованы для всех кусочков (parts), весь полученный исходный код, всё! Для обычного проекта такой метод "выстрел из дробовика" не нужен. Snapcraft поддерживает очистку отдельных частей и даже индивидуальный шаг конкретного кусочка.
Пример
snapcraft clean кусочек-что-вы-изменили
Другой пример показывает что вы очищаете шаг stage у кусочка с именем part1
snapcraft clean part1 --step=stage
Используя такой подход, вы очищаете только то что нужно вам очистить и ничего больше. Все остальные части-кусочки останутся такими, какими они были. Когда вы запустите снова snapcraft, то он оставит их в покое и обновит только то, что вы очистили.
Начиная с версии 3.0, snapcraft сделали умнее, но, по ряду причин, функция по умолчанию выключена. Создайте файл ~/.config/snapcraft/cli.cfg и вставьте строки
[Lifecycle] outdated_step_action = clean
Теперь ваш рабочий процесс упаковки будет более интуитивен:
1) В папке сборочного процесса запускается snapcraft, который считывает ваши указания из файла snap/snapcraft.yaml и начинает обрабатывать кусочки (parts), скачивая (fetch) и собирая (build) все зависимости для создания итогового snap. Это может занять много времени.
2) Установка snap для проверки.
3) Осознание что что-то пошло не так.
4) Исправление кода (стартового скрипта, конфигурационных параметров и т.д.)
5) Запуск snapcraft снова.
6) Snapcraft видит что вы изменили и обновляет тот кусочек, который это затрагивает. Переходите к шагу 2.
Намного лучше? Но и в этот процесс можно внести улучшение.
Snap пакет - это squashfs образ, который по определению доступен только-для-чтения. Создание образа занимает время, а также требуется снова устанавливать пакет при каждом изменении. Эти два этапа отбирают время у собственно кодирования-исправления. Есть малоизвестная возможность snap try
Когда вы запускаете snapcraft без аргументов, то просите его пройти весь жизненный цикл и создать пакет.
Для каждого кусочка будет сделано:
На шаге prime snapcraft создаст каталог prime/ и положит туда всё что составляет финальный snap пакет. Получается что последний шаг snap просто пакует каталог prime/ в squashfs образ. snap try
это возможность выполнения из каталога, а не из образа squashfs.
Другими словами, появляется возможность избежать тяжёлого шага упаковки snap и потерянного времени на установку, добавляя возможность чтения/записи, что разительно меняет ваш рабочий процесс.
1) Запустите snapcraft prime
, который выполнит все предыдущие этапы pull -> build -> stage и вы получите готовый каталог prime/ с построенными зависимостями, метаданными для snapd и т.д.
2) Запустите snap try prime/
и тестируйте ваш софт в snap формате.
3) Осознание что что-то пошло не так.
4) Исправьте код.
5) Снова запустите snapcraft prime
, чтобы внести изменения в prime/
6) Тестируйте снова. Ваши изменения уже доступны для использования, поскольку они находятся в каталоге prime/ и не нужны snap install
или snap try
. Вернитесь на п.п 3
Это уже довольно быстро и приятно! Вы даже можете пропустить шаги 4 и 5 и прямиком изменять файлы в каталоге prime/, чтобы быстрее понять что необходимо для работоспособности вашего софта в snap формате. Выяснив этим хитрым хаком, вы потом внесёте изменения уже в основной процесс и приблизите получения финального рабочего snap пакета.
Оригинал Develop your snaps faster
Решил перевести статью Кайла для будущих снапкрафтеров, чтобы они не тратили своё время, как я, перестраивая всё заново на каждую ошибку. С snap try, то всё стало действительно быстро и весело. Рекомендую вам присмотреться к snap пакетам, если есть мысли представить свою или стороннюю программу для пользователей Linux систем.
Дата последней правки: 2020-11-24 20:32:04