Monorepo da Git — katta loyihalarda ishlash
Muammodan boshlaylik
"Dokon" loyihasi o'sdi va endi u uchta qismdan iborat — har biri alohida repozitoriyda:
dokon-frontend (React)
dokon-backend (Node.js)
dokon-shared (umumiy turlar va validatsiya — npm paket)
Yangi maydon qo'shish uchun — "mahsulotga chegirma maydoni":
dokon-sharedda turni o'zgartirish → PR → merge → npm ga1.4.0relizdokon-backenddadokon-shared@1.4.0ga yangilash → API o'zgartirish → PRdokon-frontendda ham yangilash → UI → PR
Bitta funksiya — uchta PR, uchta reliz, uchta review. Va ularni bir vaqtda deploy qilishni unutmaslik.
Monorepo — bularning hammasini bitta repozitoriyda saqlash.
Monorepo va polyrepo
POLYREPO MONOREPO
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────────────────┐
│ frontend │ │ backend │ │ shared │ │ dokon/ │
│ .git │ │ .git │ │ .git │ │ ├── .git │
└──────────┘ └──────────┘ └──────────┘ │ ├── apps/ │
│ │ ├── web/ │
│ │ └── api/ │
│ ├── packages/ │
│ │ └── shared/ │
│ └── package.json │
└──────────────────────────┘
Endi chegirma maydoni — bitta commit, bitta PR: tur, API va UI birgalikda o'zgaradi, birgalikda review qilinadi va birgalikda deploy bo'ladi.
[!INFO] Monorepo — "monolit" emas. Ichidagi ilovalar mustaqil bo'lishi, alohida deploy qilinishi mumkin. Ular faqat bitta repozitoriyda saqlanadi. Google, Meta, Microsoft kabi kompaniyalar ming-minglab loyihalarni bitta monorepo da saqlaydi.
Afzalliklar va kamchiliklar
| Monorepo | Polyrepo | |
|---|---|---|
| Bir nechta qismni o'zgartiruvchi funksiya | ✅ Bitta PR, atomik | ❌ Ko'p PR, sinxronlash |
| Umumiy kod | ✅ To'g'ridan-to'g'ri import | Paket chiqarish va versiyalash |
| Refaktoring butun loyiha bo'ylab | ✅ Oson | Qiyin |
| Bitta qoidalar (lint, CI, TS sozlamalari) | ✅ Bir joyda | Har birida takrorlanadi |
| Repozitoriy hajmi | ❌ Katta, sekinlashishi mumkin | ✅ Kichik |
| Ruxsatlar (kim nimaga kiradi) | ❌ Murakkab | ✅ Oddiy |
| CI tezligi | ❌ Aqlli sozlashsiz — hammasi har safar | ✅ Faqat o'zi |
| Mustaqil jamoalar, turli texnologiyalar | Murakkablashadi | ✅ Tabiiy |
Tipik tuzilma (JavaScript)
dokon/
├── apps/
│ ├── web/ ← React frontend
│ │ └── package.json (name: "@dokon/web")
│ └── api/ ← Node.js backend
│ └── package.json (name: "@dokon/api")
├── packages/
│ ├── shared/ ← umumiy turlar, validatsiya
│ └── ui/ ← umumiy komponentlar
├── package.json ← workspaces
├── pnpm-workspace.yaml
└── turbo.json
Workspaces (pnpm, npm, yarn) — paketlar bir-biriga lokal bog'lanadi:
# pnpm-workspace.yaml
packages:
- "apps/*"
- "packages/*"
// apps/api/package.json
{
"dependencies": {
"@dokon/shared": "workspace:*"
}
}
@dokon/shared npm dan emas, to'g'ridan-to'g'ri packages/shared dan olinadi — o'zgarish darhol ko'rinadi.
Turborepo, Nx — faqat o'zgargan paketlarni build va test qiladi va natijalarni keshlaydi.
Monorepo da Git
Commitlar va sohalar
Conventional Commits (34-dars) ning scope i — paket nomi:
feat(web): mahsulot kartasida chegirma belgisi
fix(api): chegirma 100% dan oshmasligi tekshirildi
feat(shared)!: Mahsulot turiga majburiy `chegirma` maydoni
Bitta qism tarixi
git log --oneline -- apps/api/ # faqat backend o'zgarishlari
git log --oneline -- packages/shared/
git diff main...feature/chegirma -- apps/web/ # PR dagi frontend qismi
CODEOWNERS — kim mas'ul
.github/CODEOWNERS:
/apps/web/ @dokon/frontend-jamoa
/apps/api/ @dokon/backend-jamoa
/packages/shared/ @otabek @malika
*.md @dokon/docs
PR apps/api/ ni o'zgartirsa — backend jamoasi avtomatik reviewer bo'ladi. Branch protection da "Require review from Code Owners" yoqilsa — ularning tasdig'i majburiy.
CI — faqat o'zgarganini
GitHub Actions (38-dars):
on:
pull_request:
paths:
- "apps/api/**"
- "packages/shared/**"
Frontend ning README si o'zgarsa — backend testlari ishga tushmaydi.
Katta repozitoriylarni tezlashtirish
Monorepo yillar davomida o'sadi. Git da maxsus vositalar bor:
Sparse checkout — faqat kerakli papkalar
Siz faqat apps/web da ishlaysiz — qolgan 50 ta paket kerak emas:
git clone --filter=blob:none --sparse git@github.com:kompaniya/dokon.git
cd dokon
git sparse-checkout set apps/web packages/shared packages/ui
Ishchi papkada faqat shu papkalar. Tarix va boshqa branch lar — joyida.
git sparse-checkout add apps/api # yana qo'shish
git sparse-checkout disable # hammasini qaytarish
Boshqa vositalar
git clone --filter=blob:none ... # partial clone (20-dars)
git maintenance start # fonda optimizatsiya (commit-graph, prefetch)
git config core.fsmonitor true # fayl o'zgarishlarini tez aniqlash (git status tezlashadi)
Qachon monorepo tanlash
✅ Monorepo:
- Frontend, backend va umumiy kod birga o'zgaradi
- Bitta jamoa yoki yaqin hamkorlikdagi jamoalar
- Bir xil til va vositalar (masalan, hammasi TypeScript)
- Umumiy kod ko'p
✅ Polyrepo:
- Mustaqil mahsulotlar, mustaqil reliz sikllari
- Turli jamoalar, turli texnologiyalar (Go backend + Swift iOS)
- Qat'iy ruxsat chegaralari kerak
- Ochiq kodli kutubxona + yopiq mahsulot
Kichik loyihada ham monorepo foydali bo'lishi mumkin — frontend va backend bitta repozitoriyda, apps/ papkalarida. Bu ko'pincha eng sodda boshlanish.
Nima uchun shunday?
Nima uchun dunyodagi eng katta kompaniyalar ko'pincha monorepo ni tanlaydi — milliardlab qatorli bitta repozitoriy noqulay emasmi?
Noqulay — va ular buning uchun maxsus vositalar yaratadi. Lekin ular yutadigan narsa qimmatroq: atomik o'zgarishlar va yagona haqiqat. Polyrepo da umumiy kutubxonadagi o'zgarish yuzlab repozitoriyga oylab tarqaladi; ba'zilari eski versiyada qolib ketadi va "versiyalar jahannami" boshlanadi. Monorepo da o'zgarish va uning barcha foydalanuvchilari bitta commit da yangilanadi — testlar butun tizimni bir vaqtda tekshiradi. Kichik loyihalar uchun esa Git ning o'zi yetarli: o'n minglab faylgacha monorepo hech qanday maxsus vositasiz ishlaydi.
Xulosa
Eslab qoling:
- Monorepo — bir nechta loyiha bitta repozitoriyda; polyrepo — har biri alohida
- Afzallik: atomik o'zgarishlar, umumiy kod, yagona qoidalar
- Kamchilik: hajm, CI tezligi, ruxsatlar
- JS:
apps/+packages/, workspaces (workspace:*), Turborepo / Nx - Commit scope — paket nomi;
git log -- apps/api/— bitta qism tarixi CODEOWNERS— avtomatik reviewerlar- CI da
paths:— faqat o'zgargan qism git sparse-checkout set ...— faqat kerakli papkalar
Keyingi bo'lim
7-bo'lim: GitHub Imkoniyatlari — Actions, Pages, Releases, Projects, Packages va Secrets.