ทุกสิ่งเกี่ยวกับ Monorepo
(monorepo.tools)Monorepo คืออะไร
- "การนำหลายโปรเจกต์ที่แยกจากกันมาไว้ใน Repo เดียว ผ่านความสัมพันธ์ที่นิยามไว้อย่างชัดเจน"
- Monorepo ≠ Monolith
ทำไมถึงควรทำ?
- เหตุผลที่เดิมเลือกใช้ Polyrepo (แนวทางที่ใช้หลาย Repo) คือเรื่อง "ความเป็นอิสระของทีม (team autonomy)"
- แต่ละทีมสามารถเลือกไลบรารีที่ต้องการเองได้ และตัดสินใจได้ว่าใครจะมีส่วนร่วมกับโค้ดและใครจะใช้งานมัน
- PolyRepo
- การแชร์โค้ดยุ่งยาก
- มีโค้ดซ้ำจำนวนมาก
- เมื่อต้องแก้ critical bug หรือทำการเปลี่ยนแปลงครั้งใหญ่ในไลบรารีที่ใช้ร่วมกัน จะมีต้นทุนสูง
- แต่ละโปรเจกต์ใช้เครื่องมือพัฒนาไม่สอดคล้องกัน
- Monorepo
- ไม่มี overhead ในการสร้างโปรเจกต์ใหม่
- ทำ atomic commit ได้ครอบคลุมทั้งทุกโปรเจกต์
- จัดการทุกอย่างด้วยหมายเลขเวอร์ชันเดียว
- รองรับ developer mobility (การย้ายข้ามโปรเจกต์)
ฟีเจอร์ที่เครื่องมือ Monorepo มีให้ และการเปรียบเทียบระหว่างเครื่องมือแต่ละตัว
→ Bazel, Gradle, Lage, Lerna, Nx, Rush, Turborepo
- local caching
- local task orchestration
- distributed caching
- distributed task execution
- transparent remote execution
- การตรวจจับโปรเจกต์/แพ็กเกจที่ได้รับผลกระทบ
- การวิเคราะห์ workspace
- การแสดงภาพ dependency graph
- การแชร์โค้ด
- tooling ที่สอดคล้องกัน
- การสร้างโค้ดอัตโนมัติ
- ข้อจำกัดของโปรเจกต์และการมองเห็น
การเปลี่ยนมุมมอง
Monorepo เปลี่ยน "องค์กรและวิธีคิดเกี่ยวกับโค้ด" ของคุณ
- เพิ่มความสอดคล้อง
- ลดแรงเสียดทานเมื่อสร้างโปรเจกต์ใหม่หรือทำรีแฟกเตอร์ครั้งใหญ่
- ส่งเสริมการแชร์โค้ดและการทำงานร่วมกันระหว่างทีม
- ทำให้องค์กรทำงานได้อย่างมีประสิทธิภาพมากขึ้น
มีโซลูชันหลากหลาย แต่แต่ละตัวมีเป้าหมายต่างกัน
- Bazel (by Google) : “A fast, scalable, multi-language and extensible build system.”
- Gradle (by Gradle, Inc) : “A fast, flexible polyglot build system designed for multi-project builds.”
- Lage (by Microsoft) : “Task runner in JS monorepos”
- Lerna : “A tool for managing JavaScript projects with multiple packages.”
- Nx (by Nrwl) : “Next generation build system with first class monorepo support and powerful integrations.”
- Rush (by Microsoft) : “Geared for large monorepos with lots of teams and projects. Part of the Rush Stack family of projects.”
- Turborepo (by Vercel) : “The high-performance build system for JavaScript & TypeScript codebases.”
4 ความคิดเห็น
พอพัฒนาแอปพลิเคชันแล้วต้องติดตั้งให้ลูกค้าแต่ละราย
บางลูกค้าก็มีช่วงที่ไม่ต้องการอัปเกรดอีกต่อไป
บางลูกค้าก็ยังต้องการเวอร์ชันพิเศษเฉพาะของพวกเขาเอง
ดังนั้นพอลูกค้าลักษณะนี้เพิ่มขึ้นเรื่อย ๆ
สุดท้าย Repository ก็เต็มไปด้วย branch เวอร์ชันคัสตอมสำหรับลูกค้าเป็นสิบ ๆ ราย
แต่ละ branch ก็มีเวอร์ชันที่ต่างกันอยู่นิดหน่อย
พอมาเห็นบทความเกี่ยวกับ Monorepo ในสถานการณ์แบบนี้.. ฟังดูเหมือนเรื่องในฝันจริง ๆ เลยครับ 555
ทำให้นึกถึงตอนที่ Torvalds เคยบอกว่าโดยมากแล้ว shared library ไม่ใช่ไอเดียที่ดีในหลายสถานการณ์.. ช่วงนี้ผมก็ลองเอามาใช้ดูเหมือนกัน แต่ส่วนที่พอจะแชร์กันได้จริง ๆ กลับมีไม่มาก ขณะที่ปัญหาที่ทำให้ build system พันกันยุ่งกลับใหญ่ เลยรู้สึกว่า monorepo ไม่ได้เป็นระบบในอุดมคติอย่างที่คาดหวังไว้..
สมัยที่ subversion กำลังเป็นกระแส มันก็เป็นเรื่องที่ธรรมดามากอยู่แล้ว เลยยิ่งรู้สึกว่ามันมีความย้อนแย้งอยู่พอสมควร
ก็น่าแปลกใจเหมือนกันที่ถูกพูดถึงจำกัดอยู่แค่การพัฒนาฝั่งฟรอนต์เอนด์
ทาง ms ก็เคยสร้าง virtual file system เพื่อให้ใช้ git ได้เหมือน subversion แต่ก็น่าเสียดายที่มันไม่ได้แพร่หลายเป็นมาตรฐานทั่วไป
ช่วงนี้ยิ่งรู้สึกว่าพวกเทคโนโลยีมันวนกลับไปวนมามากขึ้นนะครับ
แบบว่า เอ๊ะ นี่มันไอ้นั้นที่เมื่อก่อนดูไม่ค่อยเวิร์กไม่ใช่เหรอ? เลยแอบคิดเหมือนกันว่า.. หรือเราจะคลุกวงการมานานเกินไปแล้วนะ ฮือๆ