Monorepo กับการจัดการ Repository ในระดับ Mega Project

clock
25 May 2022
Monorepo มาจากคำว่า mono (หนึ่งเดียว) บวกกับ repo (repository = คลังเก็บข้อมูล)

Monorepo คือการรวบรวมหลายๆโปรเจกต์อยู่ใน repository เดียวกัน รวบรวมทุกอย่างอยู่ในที่เดียว นักพัฒนาสามารถเข้าถึงส่วนต่างๆใน repository ได้ง่าย เป็น single version of truth ที่มี dependency version เดียวในทุกๆโปรเจกต์ ในทางตรงกันข้ามของ monorepo เราจะเรียกว่า polyrepo (หรือ multirepo ) คือการที่แต่ละโปรเจกต์มี repo เป็นของตัวเอง 1 โปรเจกต์ ต่อ 1 repo แต่ละโปรเจกต์แยกจากกันโดยสิ้นเชิง สามารถเลือกใช้ third-party-library ใน repo ของตัวเองได้ตามความเหมาะสมและมีการจัดการ test, build, deploy ที่แตกต่างกัน อาจมีการแชร์ code ระหว่างโปรเจกต์ได้โดยการสร้าง repo กลางสำหรับเป็น share library repo ปัญหาของ polyrepo ที่พบก็คือเมื่อ share library มีการเปลี่ยนแปลงหรืออัพเดตเกิดขึ้น โปรเจกต์อื่นที่มี dependency จะยังไม่อัพเดตทันที ทำให้ version ไม่ตรงกัน ซึ่ง monorepo สามารถช่วยแก้ปัญหาตรงนี้ได้

ปัจจุบันบริษัทเทคโนโลยียักษ์ใหญ่ได้มีการนำ monorepo ไปใช้ในการจัดการ repository อย่างเช่น Google, facebook หรือ uber ซึ่งเป็นกรณีศึกษาที่น่าสนใจว่า monorepo มีข้อดีข้อเสียเป็นอย่างไรและเมื่อไหร่ถึงควรเลือกใช้ monorepo สามารถนำไปประยุกต์หรือปรับใช้กับการทำงานได้อย่างไร

Monorepo ดีอย่างไร ?

  • จากการที่ monorepo รวบรวมทุกอย่างอย่างไว้ใน repository เดียวกัน ทำให้นักพัฒนาแต่ละคนสามารถเข้าถึงงานของโปรเจกต์ต่างๆและเห็นการเปลี่ยนแปลงใน repo ทั้งหมด ช่วยเพิ่มประสิทธิภาพการทำงานร่วมกันระหว่างโปรเจกต์
  • สามารถสร้าง library เป็นตัวกลางเพื่อใช้ในการแชร์หรือ reuse component, ui หรือ document กันระหว่างโปรเจกต์ เวลามีการอัพเดตจะอัพเดตพร้อมกันหมด dependency โปรเจกต์เกิด consistency ช่วยลดการเขียน code ซ้ำได้ (duplicate code)
  • เป็น Single version of truth แต่ละโปรเจกต์ใช้ third party library ร่วมกัน แก้ไขปัญหา version library ของแต่ละโปรเจกต์ไม่ตรงกันได้
  • Tool บางตัวสามารถเก็บ cache บน cloud ช่วยให้ไม่ต้อง test และ build สิ่งเดิมที่เคยทำไปแล้ว
  • มี feature ที่ช่วยในการสร้างกราฟความเชื่อมโยงระหว่างแต่ละโปรเจกต์หรือ share library (Dependency graph visualization) ช่วยให้สามารถวิเคราะห์และเข้าใจโครงสร้างภาพรวมของ repo ได้

ปัญหาของ Monorepo ?

  • ในบริษัทขนาดใหญ่ที่ monorepo เก็บ source code ขนาดใหญ่ไว้ ต้องใช้พื้นที่ในการจัดเก็บเยอะและโปรเจกต์ที่มี dependency จำนวนมากส่งผลทำให้ต้องใช้เวลานานในการ build และ test ในแต่ละโปรเจกต์
  • การที่มี share library เกิดความผิดพลาด เช่น breaking change หรือ unsupported version ทำให้กระทบกับทั้ง monorepo
  • นักพัฒนาที่เข้ามาใน monorepo ทีหลังจะเจอกับข้อมูลมหาศาลและโปรเจกต์จำนวนมากที่ต้องใช้เวลาค่อนข้างนานในการศึกษาทำความเข้าใจแต่ละโปรเจกต์ให้ครบ

เมื่อไหร่ที่ควรใช้ Monorepo ?

การใช้จะ monorepo สิ่งต้องคำนึงถึงเลยคือรูปแบบการทำงานของคนในทีม การร่วมกันทำงานใน repo เดียวกัน ต้องการแชร์หรือ reuse code ระหว่างโปรเจกต์ไหม หรือต้องการเก็บข้อมูลไว้ใน repository เดียวกันรึเปล่า dependency ที่เกิดการเปลี่ยนแปลงสามารถกระทบกับโปรเจกต์อื่นได้ไหม

ถ้าโปรเจกต์ของเราไม่ได้ใหญ่มากและต้องการความรวดเร็วในการ test, build, deploy ขึ้น server การใช้ polyrepo ก็อาจจะเหมาะสมมากกว่า

อ้างอิง:

Tags:#Technology

Author
Writer: Thanakrit Buranakarn

ตำแหน่ง Front-end Developer สนใจใน Technology ที่เกี่ยวข้องกับ Web Application


สนใจร่วมธุรกิจกับเรา?
Mailbox