Bosh sahifa Wiki SemVer

SemVer

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, 1patch 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:

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:

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;
  • rcrelease 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:

  • barcha package’lar bir versiya oladi;
  • har package mustaqil versiyalanadi.

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:

  1. o‘zgarish turi aniqlanadi;
  2. versiya oshiriladi;
  3. changelog yaratiladi;
  4. tag qo‘yiladi;
  5. artifact build qilinadi;
  6. 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