23 คะแนน โดย xguru 2022-02-28 | 4 ความคิดเห็น | แชร์ทาง WhatsApp

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 ความคิดเห็น

 
kleinstein 2022-03-02

พอพัฒนาแอปพลิเคชันแล้วต้องติดตั้งให้ลูกค้าแต่ละราย
บางลูกค้าก็มีช่วงที่ไม่ต้องการอัปเกรดอีกต่อไป
บางลูกค้าก็ยังต้องการเวอร์ชันพิเศษเฉพาะของพวกเขาเอง

ดังนั้นพอลูกค้าลักษณะนี้เพิ่มขึ้นเรื่อย ๆ
สุดท้าย Repository ก็เต็มไปด้วย branch เวอร์ชันคัสตอมสำหรับลูกค้าเป็นสิบ ๆ ราย
แต่ละ branch ก็มีเวอร์ชันที่ต่างกันอยู่นิดหน่อย

พอมาเห็นบทความเกี่ยวกับ Monorepo ในสถานการณ์แบบนี้.. ฟังดูเหมือนเรื่องในฝันจริง ๆ เลยครับ 555

 
bbulbum 2022-02-28

ทำให้นึกถึงตอนที่ Torvalds เคยบอกว่าโดยมากแล้ว shared library ไม่ใช่ไอเดียที่ดีในหลายสถานการณ์.. ช่วงนี้ผมก็ลองเอามาใช้ดูเหมือนกัน แต่ส่วนที่พอจะแชร์กันได้จริง ๆ กลับมีไม่มาก ขณะที่ปัญหาที่ทำให้ build system พันกันยุ่งกลับใหญ่ เลยรู้สึกว่า monorepo ไม่ได้เป็นระบบในอุดมคติอย่างที่คาดหวังไว้..

 
galadbran 2022-02-28

สมัยที่ subversion กำลังเป็นกระแส มันก็เป็นเรื่องที่ธรรมดามากอยู่แล้ว เลยยิ่งรู้สึกว่ามันมีความย้อนแย้งอยู่พอสมควร
ก็น่าแปลกใจเหมือนกันที่ถูกพูดถึงจำกัดอยู่แค่การพัฒนาฝั่งฟรอนต์เอนด์
ทาง ms ก็เคยสร้าง virtual file system เพื่อให้ใช้ git ได้เหมือน subversion แต่ก็น่าเสียดายที่มันไม่ได้แพร่หลายเป็นมาตรฐานทั่วไป

 
xguru 2022-02-28

ช่วงนี้ยิ่งรู้สึกว่าพวกเทคโนโลยีมันวนกลับไปวนมามากขึ้นนะครับ
แบบว่า เอ๊ะ นี่มันไอ้นั้นที่เมื่อก่อนดูไม่ค่อยเวิร์กไม่ใช่เหรอ? เลยแอบคิดเหมือนกันว่า.. หรือเราจะคลุกวงการมานานเกินไปแล้วนะ ฮือๆ