Семантическое версионирование 2.0

... это язык, в трёх словах которого общаются независимые проекты

Автор: Ivan Osipov
Дата публикации: 2018-01-23
В категориях: Development, DevOps, Microservices, Good Patterns
Тэги: development, microservices, versioning

Восхитительное чувство, когда один раз взглянув на новую версию сторонней библиотеки ты понимаешь, можно ли её смело обновлять или нужно быть готовым к изменениям в собственном коде. В сухую нумерацию пакетов вносит осмысленность Семантическое Версионирование. У семантического версионирования есть свой сайт и основные посылы я брал оттуда (ссылка в конце статьи).

Основная Идея

Существует основной формат:

MAJOR.MINOR.PATCH

Формат включает в себя три неотрицательные цифры, которые увеличиваются в соответствии со следующими условиями.

MAJOR - увеличение версии говорит об обратно несовместимых изменениях API.
MINOR - увеличение версии говорит о добавлении новой функциональности при сохранении обратной совместимости.
PATCH - увеличение версии говорит об обратно совместимых фиксах.

Какую проблему решаем?

При большом количестве зависимостей в вашем проекте может встать вопрос о потребности в использовании новых версий разных библиотек. Если дать полную свободу в версионировании, то процесс превратится в настоящий ад, т.к. становится абсолютно не очевидно сломает ли всё, например, переход с версии 2.3.4 на версию 2.6.8. Идея не новая, но её формализация позволяет всем использовать и понимать версии одинаково.

Как решаем?

Основная идея была описана выше, а ниже некоторые, на мой взгляд, важные вещи из спецификации SemVer.

  • если какие-то изменения сделаны после релиза, то они попадут только в новый релиз;
  • публичный API для версии 0.х.х не должен рассматриваться как стабильный, это версия для начальной разработки;
  • версия 1.0.0 определяет публичный API;
  • если часть API помечена “устаревшей”, то инкрементируем минорную версию, в том числе она может в себя включать фиксы;
  • мажорная версия может включать в себя изменения характерные минорной версии и патчу;
  • версию можно дополнять указателями на предрелизные выпуски или сборками изменяющими метаданные, но идентификаторы версий только в ASCII.

Всегда ли это подходит?

Нет, не всегда. Если вы разрабатываете программу/веб приложение для конечного пользователя, а не библиотеку или Http API, то скорее всего семантическое версионирование вам не нужно. Прежде всего, посмотрите на цели и статус вашего проекта, возможно он находится на поддержке, всё, что вы делаете, - исправляете ошибки, то есть “новая функциональность” не появляется, это значит, что первые две цифры будут вечно неизменными, тогда какой в этом смысл? С другой стороны, если взглянуть категорично, то так и должно быть, каждый раз закрывая пачку багов, вы обновляете PATCH версию, а при необходимости хот-фиксов просто расширяете её дополнительными идентификаторами.

Для кого это подходит?

Иногда, мы пишем библиотеки, иногда мы пишем модули от которых будет зависеть остальная часть системы, иногда мы пишем микросервисы с API которых будут взаимодействовать другие команды. Всё это отличные примеры того, где семантическое версионирование преобретает смысл. Семантическое версионирование - это язык, в трёх словах которого общаются независимые проекты.

Сайт Семантического Версионирования

comments powered by Disqus