Monorepo da Git — katta loyihalarda ishlash

~15 daq · Git · Professional Git Workflow

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":

  1. dokon-shared da turni o'zgartirish → PR → merge → npm ga 1.4.0 reliz
  2. dokon-backend da dokon-shared@1.4.0 ga yangilash → API o'zgartirish → PR
  3. dokon-frontend da 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.