Monorepo arxitekturasi: bitta repo, ko'p loyiha
M-Smart School platformasini qurishda biz bir nechta ilovani (admin panel, o'qituvchi interfeysi, mobil API, umumiy UI kutubxonasi) bitta repozitoriyda saqlashga qaror qildik. Bu monorepo — bitta repo ichida ko'p loyiha. Quyida nega bu yondashuvni tanladik va uni qanday qurish kerakligini amaliyotdan kelib chiqib tushuntiraman.
Monorepo nima?
Monorepo — bu bir nechta mustaqil loyiha (ilovalar va kutubxonalar) bitta versiya nazorati repozitoriyasida birga yashaydigan arxitektura. Aksincha yondashuv — har bir loyiha alohida repoda bo'lishi — polyrepo deyiladi.
Monorepo — bu "hamma narsa bitta papkada" degani emas. Bu — aniq chegaralangan, mustaqil paketlar bitta joyda, umumiy vositalar bilan boshqariladi.
Qachon monorepo kerak?
Monorepo har doim ham to'g'ri tanlov emas. U quyidagi holatlarda kuchli:
- Bir nechta ilova umumiy kod ulashadi (UI komponentlar, tiplar, util funksiyalar)
- Frontend va backend tiplari sinxron bo'lishi kerak (end-to-end type safety)
- Bitta jamoa bir nechta bog'liq loyihani parallel rivojlantiradi
Agar loyihalar butunlay mustaqil bo'lsa va alohida jamoalar tomonidan boshqarilsa, polyrepo soddaroq bo'lishi mumkin.
Struktura
Tipik Bun workspaces monorepo strukturasi quyidagicha ko'rinadi:
my-monorepo/
├── apps/
│ ├── admin/ # Next.js admin panel
│ ├── api/ # Bun + Hono backend
│ └── mobile-api/ # mobil uchun API
├── packages/
│ ├── ui/ # umumiy React komponentlar
│ ├── types/ # umumiy TypeScript tiplar
│ └── config/ # eslint, tsconfig, tailwind
├── package.json # workspaces ta'rifi
└── turbo.json # Turborepo pipelineWorkspaces ta'rifi
Ildiz package.json da workspace'larni e'lon qilamiz:
{
"name": "my-monorepo",
"private": true,
"workspaces": ["apps/*", "packages/*"],
"devDependencies": {
"turbo": "^2.0.0"
}
}Turborepo bilan tezlashtirish
Monorepo o'sgani sayin build va test sekinlashadi. Turborepo bu muammoni keshlash va parallel bajarish orqali hal qiladi. turbo.json pipeline'ni belgilaydi:
{
"$schema": "https://turbo.build/schema.json",
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": [".next/**", "dist/**"]
},
"lint": {},
"dev": { "cache": false, "persistent": true }
}
}Bu yerda muhim tushunchalar:
dependsOn: ["^build"]— paketni build qilishdan oldin uning bog'liqliklarini build qiladioutputs— keshlanadigan natijalar; o'zgarmagan paket qayta build qilinmaydicache: false— dev serverlar uchun keshlash o'chiriladi
Amaliy ish oqimi
Kundalik buyruqlar ildizdan ishga tushiriladi va Turborepo qaysi paketlarni qayta ishlash kerakligini o'zi aniqlaydi:
# barcha ilovalarni parallel ishga tushirish
turbo dev
# faqat o'zgargan paketlarni build qilish (kesh bilan)
turbo build
# bitta ilovani filtrlash
turbo build --filter=adminAfzallik va kamchiliklar
Real loyihalardan olingan xulosa — monorepo bepul kelmaydi:
- Yutuq: umumiy tiplar bilan frontend va backend hech qachon "desinxron" bo'lmaydi
- Yutuq: bitta PR'da bir nechta ilovaga tegishli o'zgarish — atomik va izchil
- Narx: CI/CD sozlash murakkabroq — faqat o'zgargan ilovani deploy qilish kerak
- Narx: repo kattalashadi, yangi dasturchi uchun kirish chegarasi yuqoriroq
Xulosa
Agar loyihalaringiz kod ulashsa va birga rivojlansa, monorepo + Turborepo kombinatsiyasi kuchli: type safety, atomik o'zgarishlar va tez build. Lekin uni CI/CD murakkabligi va katta repo bilan to'lashga tayyor bo'ling. Biz uchun M-Smart School'da bu to'g'ri tanlov bo'ldi — lekin har doimgidek, o'z kontekstingizda sinab ko'ring.
Turborepo hujjatlari — chuqurroq o'rganish uchun yaxshi boshlanish nuqtasi.