23 điểm bởi xguru 2022-02-28 | 4 bình luận | Chia sẻ qua WhatsApp

Monorepo là gì

  • "Đưa nhiều dự án riêng biệt vào trong một repo duy nhất thông qua các mối quan hệ được định nghĩa rõ ràng"
  • Monorepo ≠ Monolith

Tại sao nên làm?

  • Lý do chọn Polyrepo hiện có (cách dùng nhiều repo) là vì "tính tự chủ của đội ngũ (team autonomy)"
    • Các nhóm có thể tự chọn thư viện mình muốn, và quyết định ai sẽ đóng góp cũng như sử dụng mã nguồn
  • PolyRepo
    • Việc chia sẻ mã nguồn khá bất tiện
    • Có nhiều mã nguồn trùng lặp
    • Khi thư viện dùng chung có lỗi nghiêm trọng hoặc thay đổi lớn thì chi phí rất cao
    • Mỗi dự án dùng công cụ phát triển không nhất quán
  • Monorepo
    • Không có overhead khi tạo dự án mới
    • Atomic commit trên toàn bộ dự án
    • Quản lý mọi thứ bằng một số phiên bản duy nhất
    • Tính cơ động của lập trình viên (di chuyển giữa các dự án)

Các tính năng mà công cụ Monorepo cung cấp và so sánh giữa các công cụ

→ Bazel, Gradle, Lage, Lerna, Nx, Rush, Turborepo

  • Local caching
  • Điều phối tác vụ cục bộ
  • Distributed caching
  • Thực thi tác vụ phân tán
  • Remote execution minh bạch
  • Phát hiện dự án/gói bị ảnh hưởng
  • Phân tích workspace
  • Trực quan hóa đồ thị phụ thuộc
  • Chia sẻ mã nguồn
  • Tooling nhất quán
  • Sinh mã
  • Ràng buộc dự án và khả năng hiển thị

Sự thay đổi trong nhận thức

Monorepo thay đổi "cách tổ chứccách bạn suy nghĩ về mã nguồn"

  • Bổ sung tính nhất quán,
  • Giảm ma sát khi tạo dự án mới hoặc thực hiện refactoring quy mô lớn,
  • Thúc đẩy chia sẻ mã nguồn và cộng tác giữa các nhóm
  • Từ đó giúp tổ chức làm việc hiệu quả hơn

Có nhiều giải pháp khác nhau, nhưng mỗi giải pháp có mục tiêu riêng

  • 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 bình luận

 
kleinstein 2022-03-02

Khi phát triển ứng dụng rồi cài đặt cho từng khách hàng,
đôi khi có khách hàng không còn muốn nâng cấp nữa,
cũng có khách hàng lại yêu cầu một phiên bản đặc biệt chỉ dành cho họ.

Vì vậy, khi số lượng những khách hàng như thế ngày càng tăng,
cuối cùng repository sẽ chật kín hàng chục branch phiên bản tùy chỉnh cho từng khách hàng.
Mỗi branch lại chứa một phiên bản hơi khác nhau một chút.

Trong tình huống như thế này, đọc bài viết về Monorepo thì... đúng là nghe như một câu chuyện trong mơ vậy. haha

 
bbulbum 2022-02-28

Nhớ lại việc Torvalds từng nói rằng trong đa số trường hợp, thư viện dùng chung không phải là một ý hay.. Gần đây tôi cũng đang thử áp dụng, nhưng phần thực sự đáng để chia sẻ lại ít hơn tưởng tượng, còn chỗ hệ thống build bị rối thì nhiều, nên tôi nghĩ monorepo không phải là một hệ thống lý tưởng như kỳ vọng..

 
galadbran 2022-02-28

Vào thời Subversion còn là xu thế chủ đạo thì đây đơn giản là chuyện quá đỗi hiển nhiên, nên tôi thấy khá mỉa mai.
Tôi cũng thấy lạ khi nó chỉ được bàn tới trong phạm vi phát triển frontend.
Microsoft đã tạo ra một hệ thống tệp ảo để có thể dùng Git giống như Subversion, nhưng tiếc là nó không được phổ biến rộng rãi.

 
xguru 2022-02-28

Dạo này cứ có cảm giác công nghệ đang lặp đi lặp lại nhiều hơn. Có lúc lại nghĩ, ủa cái này chẳng phải chính là thứ ngày xưa bị chê không ổn sao?.. Chắc là mình lăn lộn quá lâu rồi. huhu