Mundarija (29)
- Bu darsda
- 1. Nega bu kerak?
- 2. Uch raqamning va'dasi
- 2.1 Qoidalar
- 2.2 Va'da kim tomonidan beriladi
- 3. Diapazonlar
- 3.1 Tekshirish asbobi: semver paketi
- 3.2 ^ — "MAJOR o'zgarmasin"
- 3.3 ~ — "MINOR ham o'zgarmasin"
- 3.4 Boshqa yozuvlar
- 4. 0.x tuzog'i
- 4.1 Nolinchi MAJOR
- 4.2 Haqiqiy misol: Vite va esbuild
- 5. Prerelease: beta, rc, canary
- 5.1 Tartib
- 5.2 Diapazon prerelease'ni o'tkazmaydi
- 5.3 Teglar: latest va boshqalar
- 6. ^ yozilsinmi yoki aniq versiya?
- 6.1 -E va save-exact
- 6.2 Qaysi biri qachon
- 7. O'z versiyangizni oshirish: npm version
- 8. Ko'p uchraydigan xatolar
- 9. Mashqlar
- 1-mashq (oson): Diapazonni o'qing
- 2-mashq (o'rta): Plagin uchun peer diapazon
- 3-mashq (qiyin): O'z semver'ingiz
- 10. Real ishda
- Xulosa
- Manbalar
Semver va versiya diapazonlari: ^, ~, x, 0.x tuzog'i va prerelease
Qisqacha: Semver — versiyani
MAJOR.MINOR.PATCHdeb yozish kelishuvi. PATCH — tuzatish, MINOR — yangi imkoniyat, MAJOR — eski kodni buzishi mumkin bo'lgan o'zgarish.package.jsondagi^1.2.3"2.0.0 gacha hammasi",~1.2.3"1.3.0 gacha" degani.0.xversiyalarda^torayadi (^0.2.3— faqat0.2.x),beta/rcversiyalar esa oddiy diapazonga umuman kirmaydi.
Bu darsda
- Semver'ning uch raqami nimani va'da qilishini aytib bera olasiz.
^,~,x,*,>=,||va oraliq diapazonlarni o'qiysiz vanpx semverbilan tekshirasiz.0.xtuzog'ini taniysiz va Vite'ningesbuildtalabini tushuntirasiz.beta,rcversiyalar tartibini va ular nega diapazonga kirmasligini bilasiz.dist-tag,save-exactvanpm versionbilan ishlaysiz.
Oldin bilishingiz kerak: package.json II: bog'liqlik turlari, npm buyruqlari chuqur, Tag va relizlar.
1. Nega bu kerak?
vazifalar kanoni 2026-10-07 da Vite 8.3.3 bilan yozildi. Ikki kundan keyin Malika o'z loyihasini boshladi va package.json ga "vite": "^8.3.3" yozdi. npm install unga boshqa versiyani berdi. Nega? Registrdan so'raymiz:
npm view vite@"^8.2.0" versionvite@8.2.0 '8.2.0'
vite@8.2.1 '8.2.1'
vite@8.2.2 '8.2.2'
vite@8.3.0 '8.3.0'
vite@8.3.1 '8.3.1'
vite@8.3.2 '8.3.2'
vite@8.3.3 '8.3.3'
vite@8.2.4 '8.2.4'
vite@8.3.4 '8.3.4'8.3.4 — 2026-10-08 da chiqqan (npm view vite time). ^8.3.3 uni ham qabul qiladi, shuning uchun Malikada 8.3.4. Ro'yxat tartiblanmagan: 8.2.4 8.3.3 dan keyin turibdi — registr versiyalarni chiqarilgan vaqti bo'yicha beradi. 8.2.4 — eski qator uchun keyinroq chiqqan tuzatish.
Bu yomonmi? Odatda yo'q: PATCH — faqat tuzatish. Lekin "odatda" — va'da, kafolat emas. Bugun shu va'dani o'qishni o'rganamiz: ^, ~ va boshqa belgilar qaysi yangilanishni o'tkazadi va qaysi birida ehtiyot bo'lish kerak.
Maslahat: Chiqishlar 2026-10-10 da Node 24.21.0, npm 11.19.0 va
semver7.8.5 bilan olingan. Registr ro'yxatlari (versiyalar, teglar) siz o'qiyotgan kuni uzunroq bo'ladi.
2. Uch raqamning va'dasi
2.1 Qoidalar
Tag va relizlar darsida o'z relizlaringizga raqam qo'ygansiz. Endi xuddi shu qoidani boshqalar paketiga qo'llaymiz. semver.org (Semantic Versioning 2.0.0) bo'yicha:
| Qism | Qachon oshadi | Siz uchun ma'nosi |
|---|---|---|
PATCH: 1.4.2 → 1.4.3 |
xato tuzatildi | xotirjam yangilang |
MINOR: 1.4.2 → 1.5.0 |
yangi imkoniyat, eski kod buzilmaydi | yangilang, yangilikni o'qing |
MAJOR: 1.4.2 → 2.0.0 |
eski kod buzilishi mumkin | changelog'ni o'qib, sinab |
MINOR oshganda PATCH nolga tushadi, MAJOR oshganda — ikkalasi ham. "Buzadi" deganda ommaviy API nazarda tutiladi: hujjatlangan funksiyalar, parametrlar, exports eshiklari. Ichki faylni yopish ham MAJOR — kimdir unga ulangan bo'lishi mumkin.
2.2 Va'da kim tomonidan beriladi
Semver — kelishuv, uni hech qanday dastur tekshirmaydi. Muallif PATCH deb chiqargan versiya baribir sizni buzishi mumkin: u xatoni "tuzatgan", siz esa aynan o'sha xatoga tayangan bo'lishingiz mumkin. Shuning uchun semver xavfni kamaytiradi, yo'qotmaydi. Qolganini lock-fayl (Lock-fayllar va npm ci) va testlar qiladi.
npm view versiyani tekshiradi — semver bo'lmagan yozuvni registr qabul qilmaydi (pasport darsidagi Invalid version: "1.0").
3. Diapazonlar
3.1 Tekshirish asbobi: semver paketi
npm'ning o'zi diapazonlarni semver paketi bilan o'qiydi. Uni mashq loyihasiga o'rnatsak, terminalda xuddi npm kabi tekshira olamiz. kurs/mashqlar/16/08-semver/ da:
npm i -D -E semver@7.8.5
added 1 package, and audited 2 packages in 2s
found 0 vulnerabilitiesnpx semver -r "<diapazon>" <versiyalar…> — ro'yxatdan diapazonga moslarini chiqaradi. Hech biri mos kelmasa — hech narsa chiqarmaydi va 1 bilan tugaydi.
3.2 ^ — "MAJOR o'zgarmasin"
npx semver -r "^1.2.3" 1.2.2 1.2.3 1.2.9 1.9.0 2.0.01.2.3
1.2.9
1.9.0^1.2.3 — 1.2.3 dan boshlab, 2.0.0 dan oldingacha. 1.2.2 — juda eski, 2.0.0 — yangi MAJOR. npm npm i da sukut bo'yicha shu belgini yozadi.
3.3 ~ — "MINOR ham o'zgarmasin"
npx semver -r "~1.2.3" 1.2.3 1.2.9 1.9.0 2.0.01.2.3
1.2.9~1.2.3 — 1.2.x qatori, 1.3.0 dan oldingacha. Ehtiyotkorroq: faqat tuzatishlar keladi.
3.4 Boshqa yozuvlar
| Yozuv | Ma'nosi | Sinov (npx semver -r) |
|---|---|---|
1.2.3 |
aynan shu | faqat 1.2.3 |
1.x yoki 1 |
1-qator hammasi | 1.0.0, 1.9.9 (2.0.0 emas) |
* yoki "" |
har qanday | 0.1.0, 9.9.9 |
>=1.2.0 <1.5.0 |
ikki chegara (bo'sh joy — "va") | 1.2.0, 1.4.9 |
| Yozuv | Ma'nosi | Sinov (npx semver -r) |
|---|---|---|
^1.0.0 || ^2.0.0 |
"yoki" | 1.5.0, 2.3.0 (3.0.0 emas) |
1.2.3 - 1.4 |
oraliq, ikki uchi ham kiradi | 1.2.3, 1.4.9 (1.5.0 emas) |
latest, next |
teg (diapazon emas) | «Teglar» bo'limida |
Har sinov qatori npx semver ning haqiqiy chiqishi. Qiziq holat — 1.2.3 - 1.4: oxiri to'liq yozilmagan, shuning uchun 1.4.x ning hammasi kiradi.
|| ni siz bog'liqlik turlari darsida ko'rgansiz: typescript-eslint ning eslint: '^8.57.0 || ^9.0.0 || ^10.0.0' talabi. Plaginlar shunday qilib bir nechta MAJOR'ni qo'llab-quvvatlaydi.
flowchart LR
A["1.2.3"] --> B["1.2.9<br/>PATCH"]
B --> C["1.9.0<br/>MINOR"]
C --> D["2.0.0<br/>MAJOR"]
T["~1.2.3"] -.-> B
K["^1.2.3"] -.-> C
E["1.2.3 aniq"] -.-> ASxemada: har belgi qaysi yangilanishgacha yetib boradi. ~ — PATCH gacha, ^ — MINOR gacha, aniq versiya — joyida.
Tekshirib ko'ring:
"prettier": "~3.9.0". Registrda 3.9.9, 3.10.0 va 4.0.0 bor.npm install(lock-faylsiz) qaysi birini o'rnatadi?
Javob
3.9.9. ~3.9.0 — 3.9.x qatori, 3.10.0 MINOR o'zgargani uchun kirmaydi. npm diapazonga mos versiyalardan eng yangisini tanlaydi — npm outdated dagi Wanted ustuni ham aynan shu (npm buyruqlari).
4. 0.x tuzog'i
4.1 Nolinchi MAJOR
0.x.y — "paket hali barqaror emas" degani. semver.org: "MAJOR nol bo'lsa, hamma narsa istalgan vaqtda o'zgarishi mumkin". npm buni hisobga oladi va ^ ni toraytiradi:
npx semver -r "^0.2.3" 0.2.3 0.2.9 0.3.0 1.0.00.2.3
0.2.9npx semver -r "^0.0.3" 0.0.3 0.0.40.0.3Qoida: ^ chapdan birinchi noldan farqli raqamni qotiradi. ^1.2.3 da — 1, ^0.2.3 da — 2, ^0.0.3 da — 3. Shuning uchun 0.x paketda ^0.2.3 amalda ~0.2.3 kabi, ^0.0.3 esa aniq versiya kabi ishlaydi.
4.2 Haqiqiy misol: Vite va esbuild
esbuild — mashhur va keng ishlatiladigan bundler, lekin uning versiyasi 2026-10 holatiga hali 0.28.2. Vite 8.3.3 ning ixtiyoriy peer talabi (bog'liqlik turlari):
esbuild: '^0.27.0 || ^0.28.0'Nega ||? Chunki ^0.27.0 0.28 ni o'z ichiga olmaydi — esbuild uchun 0.27 → 0.28 MAJOR o'tishga teng. Vite jamoasi ikkala qatorni sinab, ikkalasini ham ochiq yozgan. 0.29 chiqsa, Vite uni yangi versiyada qo'shadi.
Xulosa: 0.x paket o'rnatganda package.json dagi ^0.… yozuvi "kichik yangilanishlar ham kelaveradi" degani emas. Va'dasiz paket — ehtiyot bo'ling, aniq versiya yozing.
Tekshirib ko'ring:
"nanoid": "^0.2.3"deb yozilgan (o'ylab topilgan holat). Registrda0.2.10va0.3.0chiqdi. Qaysi biri o'rnatiladi?
Javob
0.2.10. MAJOR nol bo'lgani uchun ^ MINOR'ni (2) qotiradi: 0.2.x ning eng yangisi. 0.3.0 — 0.x dunyosida "buzuvchi" yangilanish. E'tibor bering: 0.2.10 > 0.2.9 — raqamlar matn emas, son sifatida solishtiriladi.
5. Prerelease: beta, rc, canary
5.1 Tartib
Prerelease (reliz oldi) versiya — - dan keyin yorliq: 2.0.0-beta.1, 7.0.1-rc. U o'sha uch raqamli relizdan oldin turadi. semver versiyalarni o'sish tartibida chiqaradi:
npx semver 1.2.3-beta.1 1.2.3-beta.10 1.2.3-rc.1 1.2.3 1.2.3-alpha1.2.3-alpha
1.2.3-beta.1
1.2.3-beta.10
1.2.3-rc.1
1.2.3Uch qoida ko'rinib turibdi. Yorliqlar alifbo bo'yicha: alpha < beta < rc ("release candidate" — reliz nomzodi). Nuqtadan keyingi raqamlar son sifatida: beta.10 > beta.1. Prerelease'siz 1.2.3 — eng katta.
5.2 Diapazon prerelease'ni o'tkazmaydi
npx semver -r "^8.3.0" 8.3.3 8.4.0-beta.1 9.0.0-alpha.08.3.38.4.0-beta.1 raqamlar bo'yicha ^8.3.0 ichida, lekin chiqmadi. Qoida: oddiy diapazon sinov versiyalarini hech qachon olmaydi. Siz npm i vite qilganingizda tasodifan beta olmasligingiz shundan. Majburlash mumkin:
npx semver -r "^8.3.0" --include-prerelease 8.3.3 8.4.0-beta.18.3.3
8.4.0-beta.1Yoki diapazonni prerelease'dan boshlash: ^8.4.0-beta.0.
npx semver -r "^8.4.0-beta.0" 8.4.0-beta.1 8.4.0 8.5.0-beta.08.4.0-beta.1
8.4.08.4.0 ning keyingi betalari va barqaror relizlar kiradi, boshqa uch raqamning betasi (8.5.0-beta.0) — yo'q. "Shu betani sinayapman, keyin relizga o'taman" degan holat uchun.
5.3 Teglar: latest va boshqalar
npm buyruqlari darsida teglarni (dist-tag) ko'rgansiz. Katta loyihalarda ular ko'p:
npm view react dist-tags{
beta: '19.0.0-beta-26f2496093-20240514',
rc: '19.0.0-rc.1',
next: '19.3.0-canary-d5736f09-20260507',
backport: '19.0.8',
latest: '19.3.0',
experimental: '0.0.0-experimental-b618bbb4-20261007',
canary: '19.3.0-canary-b618bbb4-20261007'
}| Teg | Ma'nosi |
|---|---|
latest |
npm i react beradigan versiya — barqaror |
next, canary |
keyingi versiyaning kundalik yig'ilishi |
rc, beta |
reliz oldi sinovi |
backport |
eski qator uchun tuzatish (19.0.x) |
canary (kanareyka) — shaxtyorlar zaharli gazni sezish uchun olib tushgan qushdan olingan nom: "birinchi bo'lib sinab ko'radi". experimental versiyasi 0.0.0-… bilan boshlanadi — ^19 kabi diapazonlarga u hech qachon tushmaydi.
Esda tuting: latest — eng katta versiya emas, muallif belgilagan barqaror versiya. Muallif eski qatorga tuzatish chiqarsa (backport), u latest ga tegmaydi. TypeScript'da ham shunday: npm view typescript dist-tags — latest: '7.0.2', next: '7.1.0-dev.20261010.1' (kundalik yig'ilish).
Tekshirib ko'ring: Bobur
npm i react@nextqildi.package.jsonga nima yoziladi va keyinginpm installda u o'zgaradimi?
Javob
Tegning o'zi emas, uning versiyasi yoziladi: "^19.3.0-canary-…" (npm buyruqlari darsidagi nanoid@legacy misoli kabi). Prerelease'dan boshlangan ^ diapazon keyingi barqaror 19.x relizlarni ham qabul qiladi, lekin boshqa canary'larni — yo'q. Lock-fayl bor ekan, npm install hech narsani o'zgartirmaydi.
6. ^ yozilsinmi yoki aniq versiya?
6.1 -E va save-exact
npm buyruqlari darsida ko'rdingiz: npm i -E belgisiz versiya yozadi. vazifalar dagi hamma paket shunday: "vite": "8.3.3", "prettier": "3.9.9". Har safar -E yozmaslik uchun loyihaning .npmrc fayliga save-exact=true qo'yiladi — .npmrc darsida.
6.2 Qaysi biri qachon
| Holat | Tavsiya | Nega |
|---|---|---|
ilova (vazifalar, sayt) |
aniq versiya + lock | nima o'rnatilgani package.json dan ko'rinadi |
kutubxona dependencies |
^ |
foydalanuvchida takroriy nusxalar kamayadi |
peerDependencies |
keng ^ va || |
ko'proq mezbon versiyasi mos keladi |
0.x paket |
aniq versiya | ^ deyarli hech narsa bermaydi, va'da ham yo'q |
Ilovada ^ yozsangiz ham, lock-fayl versiyani baribir qotiradi. Farq yangilashda: aniq versiyada package.json ning o'zi o'zgaradi va diff'da "8.3.3 → 8.3.4" ko'rinadi. ^ da esa faqat lock o'zgaradi, uni o'qish qiyinroq. Kutubxona esa aniq versiya yozsa, foydalanuvchining loyihasiga bir paketning ikki nusxasini olib kirishi mumkin (node_modules ichida).
7. O'z versiyangizni oshirish: npm version
Kutubxona yozsangiz, versiyani qo'lda o'zgartirish shart emas. Kirish nuqtalari darsidagi bahor-narx ning Git repozitoriysida (version: "1.0.0"):
npm version patchv1.0.1Uchta ish bajarildi: package.json dagi version 1.0.1 bo'ldi, commit yaratildi (xabari — 1.0.1) va v1.0.1 Git tegi qo'yildi. Xabarni o'zingiz bersangiz, %s versiyaga almashadi:
npm version minor -m "reliz: %s — manti narxi"v1.1.0Sinov versiyasi:
npm version premajor --preid rcv2.0.0-rc.0premajor — "keyingi MAJOR ning birinchi sinovi", --preid rc — yorliq. Keyingi npm version prerelease — 2.0.0-rc.1, npm version patch esa prerelease'dan barqaror 2.0.0 ga o'tadi (sinab ko'rdik). Natijada git log --oneline:
f59e59d 2.0.0-rc.0
bef8910 reliz: 1.1.0 — manti narxi
fa2f0c8 1.0.1
4ade92d initGit'dagi kuzatilayotgan fayl o'zgargan bo'lsa, npm to'xtaydi:
npm error Git working directory not clean."Git ishchi papkasi toza emas" — avval commit qiling. Reliz faqat tayyor koddan yasalsin.
Tekshirib ko'ring:
bahor-narx1.4.2 da. SardorpriceOfning nominigetPricega o'zgartirdi. Qaysi buyruq?
Javob
npm version major → 2.0.0. Funksiya nomi — ommaviy API: eski priceOf ni chaqirayotgan loyihalar sinadi. Yaxshi amaliyot — bir muddat ikkalasini qoldirish (priceOf eskirgan deb belgilab), shunda o'tish MINOR'da bo'ladi va MAJOR keyinroq.
8. Ko'p uchraydigan xatolar
| Belgi | Sabab | Davosi |
|---|---|---|
| hamkasbda boshqa versiya | ^ + lock-fayl commit qilinmagan |
lock'ni commit qiling, npm ci |
^0.2.3 yangilanmayapti |
0.x da ^ torayadi |
qasddan yangi 0.y ga o'ting |
| beta o'rnatilmayapti | diapazon prerelease'ni olmaydi | aniq versiya yoki @beta |
ETARGET: No matching version found for vite@^9.0.0. |
diapazonga mos versiya yo'q | npm view vite versions |
| Belgi | Sabab | Davosi |
|---|---|---|
npx semver -r jim, chiqish kodi 1 |
hech biri mos emas | diapazonni qayta o'qing |
Git working directory not clean |
npm version va iflos papka |
commit yoki git stash |
latest eng yangisi emas |
teg qo'lda boshqariladi | npm view <nom> dist-tags |
9. Mashqlar
Mashqlar kurs/mashqlar/16/08-semver/ da, semver 7.8.5 o'rnatilgan.
1-mashq (oson): Diapazonni o'qing
npx semver dan oldin javob bering, keyin tekshiring:
^2.4.1—2.4.0,2.4.1,2.9.0,3.0.0dan mosi:~2.4.1—2.4.9yoki2.5.0:^0.4.1—0.4.9yoki0.5.0:^2.4.1—2.5.0-beta.1mosmi:
Yechim
npx semver -r "^2.4.1" 2.4.0 2.4.1 2.9.0 3.0.02.4.1
2.9.0~2.4.1 → 2.4.9; ^0.4.1 → 0.4.9 (0.x da ^ MINOR'ni qotiradi). Oxirgisi — hech narsa chiqmaydi, chiqish kodi 1: prerelease oddiy diapazonga kirmaydi.
2-mashq (o'rta): Plagin uchun peer diapazon
Siz Vite plagini yozyapsiz. U Vite 7 ning 7.1 dan boshlab hamma versiyasida va Vite 8 ning hammasida ishlaydi, Vite 9 da hali sinalmagan. peerDependencies dagi vite qiymatini yozing va npx semver bilan 7.0.9, 7.1.0, 7.9.3, 8.3.4, 9.0.0 da sinang.
Yechim
"vite": "^7.1.0 || ^8.0.0". Sinov:
npx semver -r "^7.1.0 || ^8.0.0" 7.0.9 7.1.0 7.9.3 8.3.4 9.0.07.1.0
7.9.3
8.3.4>=7.1.0 yozish xato bo'lardi — u Vite 9 ni ham "mos" deb aytadi, holbuki plagin u bilan sinalmagan. Peer diapazon — "men sinagan versiyalar" ro'yxati.
3-mashq (qiyin): O'z semver'ingiz
kichik-semver.mjs yozing:
parse(version)—"1.4.2"→{ nums: [1, 4, 2], pre: null },"2.0.0-rc.1"→pre: "rc.1", noto'g'ri yozuvdanull.satisfies(version, range)—rangeto'rt xil: aniq (1.2.3),^,~,>=. Prerelease versiya hech qaysi diapazonga kirmaydi.
kichik-semver.test.mjs da javoblaringizni haqiqiy semver.satisfies bilan ko'p versiyada solishtiring.
Ishoralar: diapazonni ikki chegaraga aylantiring — pastki (kiradi) va yuqori (kirmaydi). ^0.2.3 uchun yuqori chegara 0.3.0 («0.x tuzog'i»). Ikki versiyani raqamma-raqam solishtiring — matn sifatida emas.
Yechim
kichik-semver.mjs:
// kichik-semver.mjs — ^, ~, aniq va >= diapazonlarining nusxasi
// (prerelease diapazonlar, ||, x va oraliqlar — semver paketida)
// "1.4.2" yoki "2.0.0-beta.1" → { nums: [1, 4, 2], pre: "beta.1" }
export function parse(version) {
const re = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;
const m = re.exec(version);
if (m === null) return null;
return { nums: [+m[1], +m[2], +m[3]], pre: m[4] ?? null };
}
// a < b → manfiy, teng → 0, a > b → musbat (faqat raqamlar)
function compareNums(a, b) {
for (let i = 0; i < 3; i++) {
if (a[i] !== b[i]) return a[i] - b[i];
}
return 0;
}
// Diapazon → [pastki (kiradi), yuqori (kirmaydi)] chegaralar
function bounds(range) {
const op = /^[\^~]|^>=/.exec(range)?.[0] ?? "";
const base = parse(range.slice(op.length));
if (base === null) return null;
const [major, minor, patch] = base.nums;
if (op === "") return [base.nums, [major, minor, patch + 1]];
if (op === ">=") return [base.nums, [Infinity, 0, 0]];
if (op === "~") return [base.nums, [major, minor + 1, 0]];
// ^ — chapdagi birinchi noldan farqli raqam o'zgarmasin
if (major > 0) return [base.nums, [major + 1, 0, 0]];
if (minor > 0) return [base.nums, [0, minor + 1, 0]];
return [base.nums, [0, 0, patch + 1]];
}
export function satisfies(version, range) {
const v = parse(version);
const b = bounds(range);
if (v === null || b === null) return false;
// prerelease versiya (beta, rc) oddiy diapazonga kirmaydi
if (v.pre !== null) return false;
const [low, high] = b;
const fromLow = compareNums(v.nums, low);
return fromLow >= 0 && compareNums(v.nums, high) < 0;
}
console.log(satisfies("1.9.0", "^1.2.3")); // true
console.log(satisfies("0.3.0", "^0.2.3")); // false
console.log(satisfies("1.3.0-beta.1", "^1.2.3")); // falseOxirgi uch qator — sinash uchun. Aniq versiya 1.2.3 ham shu sxemaga tushdi: [1.2.3, 1.2.4) — "kamida 1.2.3, 1.2.4 dan kichik".
kichik-semver.test.mjs:
// kichik-semver.test.mjs — natijani haqiqiy semver paketi bilan
// solishtiradi: node --test kichik-semver.test.mjs
import { test } from "node:test";
import assert from "node:assert/strict";
import semver from "semver";
import { parse, satisfies } from "./kichik-semver.mjs";
const ranges = ["^1.2.3", "~1.2.3", "^0.2.3", "^0.0.3", "1.2.3"];
const versions = [
"1.2.2", "1.2.3", "1.2.9", "1.3.0", "1.9.9", "2.0.0",
"0.2.3", "0.2.9", "0.3.0", "0.0.3", "0.0.4", "1.3.0-beta.1",
];
test("parse", () => {
assert.deepEqual(parse("1.4.2"), { nums: [1, 4, 2], pre: null });
assert.deepEqual(parse("2.0.0-rc.1").pre, "rc.1");
assert.equal(parse("1.0"), null);
});
test("har diapazon semver paketi bilan bir xil javob beradi", () => {
for (const range of [...ranges, ">=1.2.3"]) {
for (const version of versions) {
assert.equal(
satisfies(version, range),
semver.satisfies(version, range),
`${version} ${range}`,
);
}
}
});ℹ tests 2
ℹ pass 2
ℹ fail 072 ta juftlik (6 diapazon × 12 versiya) haqiqiy semver bilan bir xil. Uchinchi argument — xato bo'lsa qaysi juftlik ekanini ko'rsatadi. Haqiqiy semver yana x, ||, oraliqlar va prerelease diapazonlarni biladi — uning manba kodi (ranges/, functions/satisfies.js) o'qishga arziydi (Begona kodni o'qish).
10. Real ishda
- Yangilash qarori semver'dan boshlanadi: PATCH — avtomatik (Dependabot/Renovate PR'i), MINOR — changelog'ni ko'rib, MAJOR — alohida vazifa (Bog'liqliklarni yangilash strategiyasi).
- Kutubxona chiqarsangiz —
npm versionva changelog. Yangi MAJOR'dan oldinrcversiyaninexttegi bilan chiqarish odat:npm publish --tag next. - 0.x paketlar — loyihada ko'p (esbuild 0.28, ko'p yosh vositalar). Ularni aniq versiyada qotiring.
- Intervyu: "
^va~farqi?", "^0.2.3qaysi versiyalarni oladi?", "neganpm ibeta bermaydi?".
Xulosa
MAJOR.MINOR.PATCH: buzuvchi o'zgarish / yangi imkoniyat / tuzatish — bu va'da, kafolat emas.^— MAJOR qotadi,~— MINOR ham qotadi;x,*,>=,||,a - b— boshqa yozuvlar;npx semver -rbilan tekshiring.0.xda^chapdagi birinchi noldan farqli raqamni qotiradi:^0.2.3=0.2.x,^0.0.3= aynan0.0.3.- Prerelease (
-beta.1,-rc.0) reliz oldida turadi va oddiy diapazonga kirmaydi; teglar (latest,next,canary) — versiyaga yorliq. - Ilovada aniq versiya + lock, kutubxonada
^, peer'da keng||. npm version patch|minor|major|premajor— versiya, commit va Git tegi bitta buyruqda.
Keyingi dars: Lock-fayllar va npm ci — diapazon "qaysi versiyalar mumkin" desa, lock-fayl "aynan qaysi biri" deydi: package-lock.json ichi va CI'da nega faqat npm ci.
Manbalar
- Semantic Versioning 2.0.0 — rasmiy spetsifikatsiya
- npm Docs (v11): About semantic versioning, npm version, npm dist-tag
semverpaketi (7.8.5) — github.com/npm/node-semver, README: "Ranges", "Prerelease Tags"
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!