Canonical представила свой формат пакета snap, который является эволюцией пакета click и рано или поздно придёт на замену пакету deb. Давайте рассмотрим структуру пакета snap.
Прежде чем начать, хотелось бы вам и себе в очередной раз разжевать, а чем не угодил deb и зачем нужен snap?
Во-первых, deb пакет хорош, но он создан людьми Дебиан, которые сплош создатели операционной системы, а не прикладные программисты. То есть deb пропитан духом - прикладной софт сторонних программистов не отличим от системы. Но стороннему софту попасть в основные репозитории и там актуально обновляться очень сложно. В deb пакете кроме бинарников есть Maintainer Scripts - команды, вызываемые при событиях удаления (post/pre rm), установки (post/pre inst). Всё это нужно проверять! Как? Canonical хочет автоматизировать сей процесс и ускорить одобрение.
Во-вторых, deb полагается на полное разрешение зависимостей между пакетами (full dependency resolution), а snappy - всё своё ношу с собой.
В-третьих, файлы из deb пакета располагаются по Filesystem Hierarchy Standard (FHS), а он пока не предполагает версионность. Snappy пакеты при обновлении будут иметь возможность отката при проблемах.
В-четвёртых, Дебиан и, следовательно, Убунту - это не rolling дистрибутивы. Есть релизы и временные рамки, в котором живёт сам релиз и софт в нём. Хотите свежую версию софта из репозитория? Добавляйте ещё один репозиторий типа PPA, где выкладывается более актуальная версия. Canonical хочет, чтобы сторонний софт безопасно появлялся у вас так быстро, как это возможно и через официальные репозитории. Со Snappy - PPA будут не нужны.
Snappy пакет невероятно прост. Весь код пакета разместят в /apps/<программа>/current/, единственное место обитания ваших файлов вашего пакета. В сущности, ваш пакет snappy - тарбол данного каталога. Из-за работы механизма откатов при проблемах, при обновлении вашего пакета snappy будут создаваться версионные папки в /apps/<программа>/<версия>/, а /apps/<программа>/current/ указывает на текущую, активную версию. Нет жёстких ограничений на структуру пакета. Можете разместить любые файлы в любом месте. Можете статически слинковать бинарники или носить с собой свои библиотеки. Создать любое дерево каталогов и файлов. Единственное условие, что должен существовать файл метаданных meta/package.yaml. Все метаданные обитают в meta/package.yaml. Их список будет ниже, а кратенько для знакомства укажем пример:
name: pkgname version: version-string binaries: - name: binary exec: path/to/binary - name: another-binary exec: path/to/another-binary
В примере, у нас есть пакет с именем pkgname, версией version-string и 2 бинарника. Бинарники, как вы поняли, нужно декларировать. Сервисы, если вы их предоставляете, так же нужно объявлять.
Данные нужно писать в каталог, зависящий от данного приложения. Предоставляются 2 места, доступные для записи. "Системный" каталог
/var/lib/apps/<pkgname>/current/
и пользовательский каталог в домашней папке
/home/$USER/apps/<pkgname>/current/
Вы не сможете писать куда-либо ещё.
Обязательные поля:
Опциональные поля:
services: - name: service-name description: "line of text" start: "relative/path/to/binary --with --cmdline --parms" stop: "path/to/command --with --parms" stop-timeout: 45 - name: service-name-2 description: "another line of text" start: "relative/path/to/binary-2 --with --cmdline-2 --parms"
Пример,
ports: internal: localcomm1: port: 3306/tcp,3307/tcp,3308/udp negotiable: yes external: ui: port: 80/tcp negotiable: no
Файл meta/readme.md содержит описание пакета в формате README. Инструментарий snappy автоматически извлекает заголовок как краткую аннотацию пакета и первый параграф как описание в Ubuntu Store.
Пока мне не ясен один момент. Если разные версии программы есть в системе, то можно их вызывать для работы по номеру версии? В целом мне нравится мир, который рисует Snappy. А вам?
Связь пакетов:
Будущее Убунту со Snappy.
Модель транзакционного обновления Snappy.