Что такое семантическое версионирование?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Семантическое версионирование (Semantic Versioning)
Семантическое версионирование (SemVer) - это стандартная система версионирования, которая определяет, как нумеровать версии программного обеспечения. Это позволяет разработчикам понять, насколько совместимо обновление с предыдущей версией.
Формат версии
Версия состоит из трех чисел: MAJOR.MINOR.PATCH
1.5.3
↑ ↑ ↑
│ │ └─ PATCH (исправления и багфиксы)
│ └──── MINOR (новые функции, обратно совместимые)
└────── MAJOR (ломающие изменения)
Компоненты версии
1. MAJOR (Мажорная версия)
Изменяется, когда сделаны ломающие изменения - изменения, которые несовместимы с предыдущей версией:
// Версия 1.0.0
function greet(name) {
return 'Hello, ' + name
}
// Версия 2.0.0 - ломающее изменение
function greet(options) { // Изменилась сигнатура функции
return 'Привет, ' + options.name
}
// MAJOR версия: 1.0.0 -> 2.0.0
2. MINOR (Минорная версия)
Изменяется при добавлении новой функциональности, которая обратно совместима с предыдущей версией:
// Версия 1.0.0
function add(a, b) {
return a + b
}
// Версия 1.1.0 - добавлена новая функция
function add(a, b, precision = 2) {
return parseFloat((a + b).toFixed(precision))
}
// Старый код работает: add(1, 2) = 3
// Новый параметр опционален, поэтому совместимо
// MINOR версия: 1.0.0 -> 1.1.0
3. PATCH (Версия патча)
Изменяется при исправлении багов, без добавления функциональности:
// Версия 1.1.0
function add(a, b, precision = 2) {
return parseFloat((a + b).toFixed(precision))
}
// Версия 1.1.1 - исправлен баг
function add(a, b, precision = 2) {
const result = a + b
return parseFloat(result.toFixed(precision))
}
// PATCH версия: 1.1.0 -> 1.1.1
Примеры версионирования
Новая библиотека - начинаем с 0.1.0 или 1.0.0:
0.0.1 - первая экспериментальная версия
0.1.0 - первый публичный релиз
0.2.0 - добавлена новая функция
0.2.1 - исправлен баг
1.0.0 - первая стабильная версия
1.1.0 - добавлена функция
2.0.0 - ломающие изменения
История версий React:
0.3.0 - начало
0.11.0 - стабилизация
0.12.0 - новые API
16.0.0 - переписано на Fiber (ломающие изменения)
16.1.0 - улучшения
16.2.0 - новые хуки
17.0.0 - ломающие изменения
18.0.0 - Concurrent Features
18.1.0 - улучшения
18.2.0 - новые функции
Правила семантического версионирования
1. Начинай с 0.1.0 или 1.0.0
1.0.0 - первая публичная версия
0.1.0 - развивающийся проект
2. После 1.0.0 используй SemVer
1.0.0 - первая стабильная версия
1.0.1 - патч
1.1.0 - минорная версия
2.0.0 - мажорная версия
3. MAJOR версия всегда вперед с обнулением остальных
1.5.3 -> 2.0.0
(не 2.5.3)
4. MINOR версия обнуляет PATCH
1.5.3 -> 1.6.0
(не 1.6.3)
5. PATCH версия не влияет на другие
1.5.3 -> 1.5.4
Использование в package.json
{
"dependencies": {
"react": "^18.2.0",
"vue": "~3.2.0",
"lodash": "4.17.21",
"webpack": "^5.70.0"
}
}
Символы версионирования:
^ (Caret) - совместимо с MINOR
^18.2.0 означает >= 18.2.0 и < 19.0.0
Позволяет обновляться на MINOR и PATCH
Обновит до 18.5.2, но не до 19.0.0
~ (Tilde) - совместимо с PATCH
~3.2.0 означает >= 3.2.0 и < 3.3.0
Позволяет обновляться только на PATCH
Обновит до 3.2.5, но не до 3.3.0
= (точная версия)
4.17.21 означает ровно 4.17.21
Обновлений не будет
Примеры реальной жизни
Обновление React с 16 на 17:
16.13.1 -> 17.0.0 (MAJOR версия)
Это ломающее обновление:
- Изменился render API
- Изменилась работа с событиями
- Требуется обновить код приложения
Обновление React с 17 на 18:
17.0.2 -> 18.0.0 (MAJOR версия)
Ломающие изменения:
- Изменилось поведение Suspense
- Изменилась автоматическая батчинговка
Обновление Next.js:
12.0.0 - старая версия
12.1.0 - новая функция (MINOR)
12.1.5 - исправление бага (PATCH)
13.0.0 - новый App Router (MAJOR)
13.1.0 - улучшения (MINOR)
Как читать версии
1.2.3-beta.4+build.20210101
↑ ↑
prerelease metadata
Prerelease (пред-версия)
1.0.0-alpha - ранняя версия, возможны ломающие изменения
1.0.0-beta.1 - версия для тестирования
1.0.0-rc.1 - Release Candidate, почти готово
1.0.0 - финальная версия
Metadata (метаданные)
1.0.0+build.1234567 - информация о сборке
1.0.0+20210101 - дата компиляции
Когда менять версию
Менять PATCH:
- Исправление бага в функции
- Улучшение производительности
- Обновление документации
Менять MINOR:
- Новая опция в функции
- Новая функция в библиотеке
- Улучшение без ломания API
Менять MAJOR:
- Удаление функции
- Изменение API сигнатуры
- Значительный рефакторинг
- Переписание внутренних алгоритмов
Вывод
Семантическое версионирование - это соглашение, которое:
- Информирует разработчиков о типе изменений
- Облегчает выбор версии для обновления
- Предотвращает ломающие обновления
- Стандартизирует версионирование в экосистеме
Практически все современные JavaScript библиотеки используют SemVer: React, Vue, Angular, webpack, Babel и тысячи других пакетов в npm.