Semantic Versioning — major, minor, patch versiyalash

~15 daq · Git · Professional Git Workflow

Muammodan boshlaylik

Loyihangiz axios kutubxonasidan foydalanadi. npm update qildingiz — va ilova buzildi. Kutubxona 1.4 dan 1.5 ga yangilangan, lekin unda funksiya nomi o'zgargan.

Yoki teskarisi: siz kutubxona chiqarasiz va foydalanuvchilar so'raydi: "2.0 ga o'tish xavfsizmi? Nima buziladi?"

Versiya raqami ma'lumot berishi kerak: bu yangilanish xavfsizmi yoki kodni o'zgartirish kerakmi? Bu kelishuv — Semantic Versioning (SemVer).


Format: MAJOR.MINOR.PATCH

   2  .  4  .  1
   │     │     │
   │     │     └── PATCH — xato tuzatishlar, moslik buzilmaydi
   │     └──────── MINOR — yangi funksiyalar, moslik buzilmaydi
   └────────────── MAJOR — buzuvchi o'zgarishlar
Nima o'zgardi Qaysi raqam Misol
Xato tuzatildi, API o'zgarmadi PATCH +1 2.4.1 → 2.4.2
Yangi funksiya, eski kod ishlashda davom etadi MINOR +1, PATCH = 0 2.4.2 → 2.5.0
Eski kod buziladi (o'chirilgan funksiya, o'zgargan format) MAJOR +1, qolganlari = 0 2.5.0 → 3.0.0

34-darsdagi Conventional Commits bilan to'g'ridan-to'g'ri bog'liq:

fix:               → PATCH
feat:              → MINOR
feat!: / BREAKING  → MAJOR

"Buzuvchi o'zgarish" nima?

Foydalanuvchi o'z kodini o'zgartirmasdan yangilasa, nimadir ishlamay qoladi:

  • ❌ Ommaviy funksiya, metod yoki endpoint o'chirildi yoki nomi o'zgardi
  • ❌ Majburiy yangi parametr qo'shildi
  • ❌ Javob formati o'zgardi (name → ism)
  • ❌ Standart xatti-harakat o'zgardi
  • ❌ Qo'llab-quvvatlanadigan minimal Node.js versiyasi oshirildi

Buzuvchi emas:

  • ✅ Yangi ixtiyoriy parametr
  • ✅ Yangi funksiya yoki endpoint
  • ✅ Ichki refaktoring (tashqi API o'zgarmasa)
  • ✅ Xato tuzatish (hatto kimdir xatoga tayangan bo'lsa ham — munozarali holat)

Maxsus holatlar

0.x.x — boshlang'ich rivojlanish

0.1.0, 0.2.0, 0.15.3

1.0.0 dan oldin — API barqaror emas, har qanday o'zgarish mumkin. Odatda 0.MINOR buzuvchi o'zgarishlar uchun ishlatiladi. 1.0.0 — "API barqaror, endi SemVer qoidalariga rioya qilamiz" degan va'da.

Pre-release

2.0.0-alpha.1    — erta, beqaror
2.0.0-beta.3     — funksiyalar tayyor, sinov
2.0.0-rc.1       — reliz nomzodi (release candidate)
2.0.0            — barqaror

Tartib: 2.0.0-alpha.1 < 2.0.0-beta.1 < 2.0.0-rc.1 < 2.0.0.

Build metama'lumot

1.4.2+build.567
1.4.2+20261106.a3f9c2b

+ dan keyingisi versiya tartibiga ta'sir qilmaydi.


npm dagi diapazonlar

package.json da bog'liqliklar SemVer diapazonlari bilan yoziladi:

{
  "dependencies": {
    "express": "^4.21.0",
    "lodash": "~4.17.21",
    "react": "19.0.0"
  }
}
Yozuv Ruxsat etilgan Ma'nosi
^4.21.0 4.21.0 ≤ v < 5.0.0 MINOR va PATCH — "mos keladigan har qanday" (standart)
~4.17.21 4.17.21 ≤ v < 4.18.0 Faqat PATCH
4.21.0 Faqat shu Aniq versiya
* yoki latest Har qanday ❌ Xavfli

^ (caret) — SemVer ga ishonish: "MAJOR o'zgarmasa, buzilmaydi". npm install express avtomatik ^ qo'yadi.

[!INFO] SemVer — va'da, kafolat emas. Ba'zi muallif lar tasodifan MINOR relizda nimadir buzadi. Shuning uchun package-lock.json (11-dars) repozitoriyda: u aniq o'rnatilgan versiyalarni qotiradi — npm ci har doim bir xil natija beradi. Yangilanishlar esa ongli ravishda: npm update → testlar → commit.


Versiya qayerda yashaydi

  1. Kodda — package.json dagi "version", pyproject.toml, composer.json
  2. Git da — teg: v2.4.1 (keyingi dars)
  3. GitHub da — Release (41-dars)
  4. CHANGELOG.md da — nima o'zgargani
npm version patch       # 2.4.1 → 2.4.2: package.json + commit + git teg
npm version minor       # 2.4.2 → 2.5.0
npm version major       # 2.5.0 → 3.0.0

npm version uchala ishni bitta buyruqda qiladi — package.json ni yangilaydi, commit qiladi va v2.4.2 tegini qo'yadi.

CHANGELOG namunasi

# Changelog

## [2.5.0] - 2026-11-06
### Added
- Mahsulotlarni kategoriya bo'yicha filtrlash (#87)
### Fixed
- Savatda manfiy miqdor kiritish taqiqlandi (#42)

## [2.4.1] - 2026-10-28
### Fixed
- Payme: summa yaxlitlash xatosi

Format: keepachangelog.com.


Veb-ilovalar uchun ham kerakmi?

Kutubxona va API lar uchun — majburiy: boshqalar sizning kodingizga bog'liq.

Oddiy veb-sayt uchun (foydalanuvchilar faqat brauzer orqali) — SemVer kamroq muhim; ko'p jamoalar CalVer (sana bo'yicha) yoki commit hash bilan ishlaydi:

2026.11.06      — CalVer
sha-a3f9c2b     — Docker teglari (Docker kursi, 38-dars)

Lekin mobil ilovalar, ommaviy API lar, kutubxonalar, CLI vositalar — SemVer.


Nima uchun shunday?

Nima uchun uchta raqam — bitta o'suvchi son (v1, v2, v3...) yetarli emasmi?

Chunki bitta son faqat "yangiroq" ekanini aytadi — lekin qanchalik xavfli ekanini emas. Loyihangizda 200 ta bog'liqlik bor; har biri haftada yangilanadi. Har birini qo'lda o'qib, "bu meni buzadimi?" deb tekshirish — imkonsiz. SemVer bu savolga raqamning o'zida javob beradi: PATCH va MINOR — avtomatik va xavfsiz olish mumkin (^), MAJOR — to'xtab, o'qib, ongli qaror qilish kerak. Bu kelishuv tufayli npm, pip, Composer kabi butun ekotizimlar millionlab paketlarni bir-biriga bog'lab ishlay oladi. Versiya raqami — muallif va foydalanuvchi o'rtasidagi shartnoma.


Xulosa

Eslab qoling:

  • MAJOR.MINOR.PATCH — buzuvchi . yangi funksiya . tuzatish
  • fix → PATCH; feat → MINOR; ! / BREAKING CHANGE → MAJOR
  • Buzuvchi — foydalanuvchi kodini o'zgartirishga majbur qiladigan har narsa
  • 0.x — beqaror API; 1.0.0 — barqarorlik va'dasi
  • Pre-release: -alpha.1, -beta.2, -rc.1
  • npm: ^ — MINOR+PATCH (standart), ~ — faqat PATCH
  • package-lock.json — aniq versiyalar; npm version patch/minor/major
  • CHANGELOG.md — keepachangelog formati

Keyingi dars

36-dars: git tag — versiyalarni belgilash, lightweight va annotated tag