หนึ่งในการตัดสินใจสำคัญที่ทีม Development ต้องเผชิญคือ “ควรใช้ Monorepo หรือ Multi-repo” บทความนี้จะอธิบายทั้งสองแนวทาง ข้อดี ข้อเสีย และวิธีเลือกให้เหมาะกับโปรเจกต์ของคุณ รวมถึงวิธีนำไปใช้กับ ผู้ให้บริการโฮสติ้ง Cloud VPS
Monorepo คืออะไร
Monorepo (Monolithic Repository) คือ Repository หนึ่งที่เก็บหลายโปรเจกต์หรือ Services ที่เกี่ยวข้องกัน แทนที่จะแยก Repository ต่อโปรเจกต์ Monorepo จัดเก็บโค้ดของหลาย Services หรือ Modules ในที่เดียว
ตัวอย่างของบริษัทที่ใช้ Monorepo ได้แก่ Google, Facebook, Microsoft, Twitter และ Uber – พวกเขาจัดเก็บโค้ดของทั้งบริษัท (หรือส่วนใหญ่) ในเพียง Repository เดียว
Multi-repo คืออะไร
Multi-repo (Multiple Repository) คือการแยก Repository ต่อ Service หรือ Project – แต่ละ Service มี Repository ของตัวเอง Monorepo ประเทศปกติของการจัดเก็บโค้ด ซึ่ง Team สามารถ Isolate และ Manage ได้อย่างอิสระ
1. Atomic Commits สำหรับหลาย Projects
ใน Monorepo คุณสามารถทำการเปลี่ยนแปลง (Changes) ที่ครอบคลุมหลาย Projects ในครั้งเดียว (Atomic) เช่น Refactoring API ที่ใช้ใน Frontend และ Backend ได้ทำ Commit เดียว
2. ใช้ Shared Libraries ได้ง่าย
ในเมื่อ Shared Code หรือ Library อยู่ใน Repository เดียวกัน สามารถ Reference และ Update ได้ง่ายกว่า ไม่ต้องจัดการ Version Mismatch และ Dependency Hell
3. Code Reuse ที่มีประสิทธิภาพ
ความง่ายในการแชร์โค้ด Utilities, Components หรือ Helper Functions ระหว่าง Projects โดยไม่ต้อง NPM Package หรือ Library Publishing
4. Refactoring ที่สะดวก
เมื่อต้อง Refactor Code ที่ Share ระหว่าง Projects สามารถ Update ทั้งหมดพร้อมกัน โดยใช้ Search เดียว ไม่ต้องกังวล API Changes และ Version Compatibility
5. CI/CD Pipeline ที่เป็นหนึ่งเดียว
สามารถสร้าง Unified CI/CD Pipeline สำหรับทั้ง Repository ที่รวมการ Build, Test และ Deploy ทั้งหมด
1. Repository ขนาดใหญ่
Monorepo มีขนาด Repository ที่ใหญ่โตได้ Google เก็บ Code 50GB+ Clone ใช้เวลามากขึ้น และต้องใช้ Sparse Checkout หรือ Shallow Clone
2. CI/CD Performance ที่ช้า
เมื่อ Commit เพียงหนึ่ง Service ต้อง Test และ Build ทั้ง Repository ได้ ส่วน Multi-repo อาจ Test เฉพาะ Module ที่ impact ได้
3. Permission Management ยาก
ยากในการ Control Access สำหรับบางส่วนของ Repository บ่อยต้องใช้ Git Hooks หรือ Custom Access Control ระบบ
4. Tooling พิเศษ
ต้องใช้ Tool พิเศษ เช่น Nx, Turborepo, หรือ Bazel เพื่อให้ Monorepo ทำงานได้เหมาะสม
1. Team Autonomy
แต่ละทีมสามารถจัดการ Repository ของตัวเองได้อย่างอิสระ ไม่ต้องกังวล Impact ต่อ Teams อื่น
2. Simpler CI/CD
แต่ละ Repository มี CI/CD Pipeline ของตัวเอง สามารถ Optimize ให้เหมาะกับ Service นั้นๆ ได้
3. Better Access Control
สามารถ Control Access ต่อ Repository ได้ชัดเจน บาง Teams สามารถ View เฉพาะ Repository ของตัวเองได้
4. Repository ขนาดเล็ก
Repository มีขนาดเล็ก Clone เร็ว แสดง History สะดวก
1. Dependency Management ซับซ้อน
การแชร์ Code ต้องผ่าน Package Manager (NPM, Pip) ทำให้ต้องจัดการ Version Mismatch และ Breaking Changes
2. Code Duplication
อาจเกิด Code Duplication เมื่อหลาย Services ต้อง Implement สิ่งเดียวกัน ลดลง Code Quality
3. Cross-Repo Changes ยุ่งยาก
เมื่อต้อง API Change ที่ affect หลาย Services ต้องแยก Pull Request ต่อ Repository และจัดการ Versioning
4. Coordinated Releases ยากขึ้น
ต้องประสานงาน Release ของหลาย Repositories เมื่อมี Dependency เชื่อมกัน
ตารางเปรียบเทียบ Monorepo vs Multi-repo
| เกณฑ์ | Monorepo | Multi-repo |
|---|---|---|
| จำนวน Repository | หนึ่ง | หลายสิบ |
| Shared Dependencies | ง่าย | ยาก |
| Atomic Commits | ได้ | ยาก |
| Code Reuse | สูง | ต่ำ |
| Refactoring | ง่าย | ยาก |
| Repository Size | ใหญ่ | เล็ก |
| CI/CD Performance | อาจช้า | เร็ว |
| Permission Management | ยาก | ง่าย |
| Team Isolation | ต่ำ | สูง |
| Tooling ต้องการ | Nx, Turborepo | Standard Git |
Startup ขั้นต้น
เมื่อ Startup เริ่มต้น Monorepo มีความเหมาะสม เพราะ Share Code มาก และทีมเล็ก สำหรับแต่งเพิ่มขึ้นทีให้
Monolithic Architecture
เมื่อแอปพลิเคชันเป็น Monolith ที่ยัง Refactor Monorepo จึง Natural Choice
Frontend-Backend Coupled
เมื่อ Frontend และ Backend มี Tight Coupling เช่น Share Types หรือ Models
Microservices Architecture
เมื่อ Services อิสระและ Loosely Coupled Multi-repo เป็นตัวเลือกที่ดี
Teams ที่เอกเทศ
เมื่อมี Teams จำนวนมากที่ต้องทำงานอิสระ Multi-repo ช่วยลดการยัดเยียด
Different Tech Stacks
เมื่อ Services ใช้ Language หรือ Framework ต่างกัน Multi-repo สะดวกกว่า
Nx
Nx เป็น Build System ที่สร้างโดย Nrwl สำหรับ Monorepo ที่ขนาดใหญ่ มี Task Orchestration, Caching, และ Affected Analysis
Turborepo
Turborepo สร้างโดย Vercel เน้น Performance และ Ease of Use มี Parallel Task Execution และ Remote Caching
Lerna
Lerna สำหรับ JavaScript/Node.js Monorepo ช่วย Publish และ Manage หลาย Packages
# ตั้งค่า Monorepo บน ผู้ให้บริการโฮสติ้ง Cloud VPS
# 1. Clone Repository
git clone myproject
cd myproject
# 2. ติดตั้ง Node dependencies
npm install
# 3. ติดตั้ง Nx (ตัวอย่าง)
npm install -g nx
# 4. สร้าง Workspace
nx generate @nx/workspace:preset
# 5. ตั้งค่า Automated Deployment
# บน ผู้ให้บริการโฮสติ้ง Cloud VPS สามารถใช้ Cron Job เพื่อ Pull และ Deploy
สรุป
การเลือกระหว่าง Monorepo และ Multi-repo ขึ้นอยู่กับความต้องการของโปรเจกต์ Monorepo เหมาะสำหรับ Startup หรือ Monolithic Architecture ที่ต้อง Atomic Commits และ Shared Code ส่วน Multi-repo เหมาะสำหรับ Microservices และทีมที่อิสระ ดังนั้นให้วิเคราะห์ความต้องการของทีมและโปรเจกต์อย่างรอบคอบก่อนตัดสินใจ
