TH | EN
TH | EN
หน้าแรกColumnistBlockfintMonorepo กับการจัดการ repository ในระดับ mega project?

Monorepo กับการจัดการ repository ในระดับ mega project?

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 สามารถนำไปประยุกต์หรือปรับใช้กับการทำงานได้อย่างไร

รูป ความแตกต่างระหว่าง polyrepo และ monorepo

ที่มา: https://monorepo.tools/

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 ได้sa

รูป Dependency graph visualization 

ที่มา : https://blog.bitsrc.io/11-tools-to-build-a-monorepo-in-2021-7ce904821cc2

ปัญหาของ 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 ก็อาจจะเหมาะสมมากกว่า 

อ้างอิง

  • https://monorepo.tools/
  • https://semaphoreci.com/blog/what-is-monorepo
  • https://www.youtube.com/watch?v=9iU_IE6vnJ8
  • https://www.squash.io/the-issue-with-monorepos

STAY CONNECTED

0แฟนคลับชอบ
440ผู้ติดตามติดตาม
spot_img

Lastest News

MUST READ