SemVer — dasturiy mahsulot va kutubxona versiyalarini ma’noli qoidalar asosida belgilash tizimi. Uning to‘liq nomi Semantic Versioning hisoblanadi.
SemVer versiya raqamini oddiy ketma-ket son sifatida emas, public API’dagi o‘zgarish turi haqida ma’lumot beruvchi contract sifatida ishlatadi. Keng tarqalgan format:
MAJOR.MINOR.PATCH
Masalan:
2.4.1
Bu yerda 2 — major, 4 — minor, 1 — patch versiya.
Public API
SemVer public API mavjudligini nazarda tutadi. Public API faqat source code’dagi function yoki classlardan iborat bo‘lmasligi mumkin.
U quyidagilarni qamrab oladi:
- function signature;
- class va interface;
- CLI optionlari;
- config fayl formati;
- environment variable;
- HTTP endpoint;
- response schema;
- error code;
- file format;
- plugin contract;
- kuzatiladigan xatti-harakat.
Qaysi qismlar public contract ekanligi hujjatlashtirilmasa, major va minor o‘zgarishni ajratish qiyinlashadi.
Major versiya
Major backward-compatible bo‘lmagan o‘zgarishda oshiriladi.
Misollar:
- public method olib tashlandi;
- parameter majburiy qilindi;
- response field ma’nosi o‘zgardi;
- CLI option nomi almashtirildi;
- eski config formati qo‘llanmaydi;
- exception turi o‘zgardi;
- public class hierarchy buzildi.
Versiya:
2.8.4 → 3.0.0
ko‘rinishida o‘zgaradi.
Major versiya oshirilganda minor va patch odatda nolga qaytariladi.
Minor versiya
Minor backward-compatible yangi imkoniyat qo‘shilganda oshiriladi.
Misollar:
- yangi optional method;
- yangi endpoint;
- yangi optional parameter;
- yangi feature flag;
- eski client e’tiborsiz qoldira oladigan yangi field;
- yangi plugin capability.
Versiya:
2.4.7 → 2.5.0
bo‘ladi.
Minor versiya oshganda patch nolga qaytariladi.
Patch versiya
Patch backward-compatible bugfix uchun oshiriladi.
Misollar:
- noto‘g‘ri hisob tuzatildi;
- memory leak bartaraf etildi;
- documentation xatosi tuzatildi;
- mavjud API contract saqlangan holda performance yaxshilandi;
- security zaifligi public behaviorni buzmasdan yopildi.
Versiya:
2.4.1 → 2.4.2
bo‘ladi.
Pre-release
Barqaror release’dan oldingi versiyalar maxsus qo‘shimcha bilan belgilanadi.
2.0.0-alpha.1
2.0.0-beta.2
2.0.0-rc.1
Keng tarqalgan ma’nolar:
- alpha — imkoniyatlar hali faol o‘zgaradi;
- beta — asosiy funksiyalar mavjud, kengroq test davom etadi;
- rc — release candidate, yakuniy versiyaga yaqin.
Pre-release oddiy release’dan past ustunlikka ega:
2.0.0-rc.1 < 2.0.0
Build metadata
Build haqida qo‘shimcha ma’lumot + belgisi bilan yoziladi.
2.4.1+build.582
2.4.1+sha.a1b2c3d
Build metadata version precedence’ni o‘zgartirmaydi.
Quyidagi ikkisi SemVer tartibida teng hisoblanadi:
2.4.1+linux
2.4.1+windows
Ular artifactni aniqlash uchun boshqa metadata beradi.
Versiyalarni solishtirish
SemVer oddiy matn sifatida solishtirilmaydi.
Masalan:
1.10.0 > 1.9.0
String bo‘yicha solishtirilsa 1.10.0 noto‘g‘ri ravishda kichik chiqishi mumkin.
SemVer parser:
- numeric segment;
- pre-release identifikatori;
- numeric va text qism;
- nuqta bilan ajratilgan tartib
qoidalarini tushunadi.
Version constraint
Package manager SemVer asosida mos versiyalar oralig‘ini tanlaydi.
Misollar:
>=2.4.0
<3.0.0
^2.4.1
~2.4.1
^ va ~ operatorlarining aniq semantikasi ekotizimga bog‘liq.
SemVer versiya formatini beradi, resolver operator qoidalarini alohida belgilaydi.
Nol major versiya
0.y.z initial development bosqichini bildiradi.
0.8.3
Bu davrda public API beqaror bo‘lishi mumkin.
Amalda 0.x package ham ko‘p production foydalanuvchiga ega bo‘lsa, o‘zgarishlarni nazoratsiz qilish xavfli. SemVer contracti jamoa tomonidan aniq bayon qilinadi.
Backward compatibility
Yangi versiya eski consumer code’ni o‘zgartirmasdan ishlatsa backward-compatible hisoblanadi.
Biroq compatibility faqat syntax emas.
Masalan, response’ga yangi field qo‘shish odatda mos. Lekin eski client unknown fieldni rad etsa, amalda breaking change yuz beradi.
Shuning uchun compatibility:
darajasida baholanadi.
Deprecation
Public API darhol olib tashlanmasdan deprecated qilinishi mumkin.
Deprecation quyidagilarni beradi:
- yangi alternativ;
- warning;
- migration yo‘li;
- olib tashlash rejalashtirilgan major versiya;
- support muddati.
Deprecated API hali ishlayotgan bo‘lsa, uni olib tashlash minor emas, major o‘zgarish hisoblanadi.
SemVer va package manager
Package manager SemVer orqali yangi versiyani avtomatik tanlashi mumkin.
Ammo publisher noto‘g‘ri versiya bersa:
- patch ichida breaking change;
- minor ichida xatti-harakat buzilishi;
- dependency graph konflikti
yuz beradi.
SemVer texnik enforcement emas, publisher va consumer o‘rtasidagi kelishuvdir.
Monorepo
Monorepo ichida versionlashning ikki modeli mavjud:
Yagona versiya release koordinatsiyasini soddalashtiradi. Mustaqil versiya esa faqat o‘zgargan package’ni yangilashga imkon beradi.
Release automation
CI pipeline commit va changelog asosida versiya chiqarishi mumkin.
Jarayon:
- o‘zgarish turi aniqlanadi;
- versiya oshiriladi;
- changelog yaratiladi;
- tag qo‘yiladi;
- artifact build qilinadi;
- registryga publish qilinadi.
Avtomatizatsiya versioning siyosatini bir xil qo‘llashga yordam beradi.
SemVer contractining chegarasi
SemVer performance, xavfsizlik yoki operatsion xatti-harakatdagi barcha o‘zgarishni avtomatik tasniflamaydi. Masalan, timeout defaultining o‘zgarishi signature’ni buzmasa ham consumer uchun muhim bo‘lishi mumkin. Loyiha public contract tarkibiga qaysi behavior va kafolatlar kirishini alohida belgilaydi.
Bog‘liq tushunchalar
Semantic Versioning, Major version, Minor version, Patch version, Pre-release, Build metadata, Backward compatibility, Deprecation, Version constraint, Changelog