Semua tentang Monorepo
(monorepo.tools)Apa itu Monorepo
- "Menempatkan beberapa proyek terpisah ke dalam satu repo melalui relasi yang terdefinisi dengan baik"
- Monorepo ≠ Monolith
Mengapa melakukannya?
- Alasan memilih Polyrepo yang ada sebelumnya (cara menggunakan beberapa repo) adalah karena "otonomi tim (team autonomy)"
- Tim dapat memilih library yang mereka inginkan, serta menentukan siapa yang berkontribusi dan menggunakan kode tersebut
- PolyRepo
- Berbagi kode merepotkan
- Banyak duplikasi kode
- Saat ada bug kritis atau perubahan besar pada library bersama, biayanya tinggi
- Penggunaan alat pengembangan yang tidak konsisten antarproyek
- Monorepo
- Tidak ada overhead untuk membuat proyek baru
- Atomic commit di seluruh proyek
- Mengelola semuanya dengan satu nomor versi
- Mobilitas developer (perpindahan antarproyek)
Fitur yang disediakan alat-alat Monorepo dan perbandingan antartool
→ Bazel, Gradle, Lage, Lerna, Nx, Rush, Turborepo
- Caching lokal
- Orkestrasi task lokal
- Caching terdistribusi
- Eksekusi task terdistribusi
- Eksekusi remote yang transparan
- Deteksi proyek/paket yang terdampak
- Analisis workspace
- Visualisasi dependency graph
- Berbagi kode
- Tooling yang konsisten
- Pembuatan kode
- Batasan proyek dan visibilitas
Perubahan cara pandang
Monorepo mengubah "organisasi Anda dan cara Anda berpikir tentang kode"
- Dengan menambahkan konsistensi,
- mengurangi friksi saat membuat proyek baru atau melakukan refactoring skala besar,
- serta mendorong berbagi kode dan kolaborasi antartim
- organisasi dapat bekerja lebih efisien
Ada berbagai solusi, tetapi masing-masing punya tujuan yang berbeda
- 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 komentar
Karena aplikasi dikembangkan lalu dipasang untuk tiap pelanggan, ada pelanggan yang pada akhirnya tidak lagi menginginkan upgrade, dan ada juga pelanggan yang meminta versi khusus mereka sendiri.
Jadi ketika pelanggan seperti ini makin bertambah, pada akhirnya repository pun penuh dengan puluhan branch versi kustom untuk masing-masing pelanggan. Setiap branch berisi versi yang sedikit berbeda.
Melihat tulisan tentang Monorepo dalam situasi seperti ini.. rasanya benar-benar seperti cerita impian. haha
Saya jadi teringat Torvalds pernah mengatakan bahwa dalam kebanyakan situasi, shared library bukanlah ide yang bagus.. Belakangan ini saya juga sedang mencoba menerapkannya, tetapi ternyata bagian yang benar-benar layak untuk dibagikan lebih sedikit dari perkiraan, sementara bagian yang membuat build system jadi ruwet cukup besar, jadi saya merasa monorepo bukanlah sistem yang seideal seperti yang diharapkan..
Pada masa ketika Subversion sedang berjaya, ini hanyalah hal yang terlalu wajar, jadi saya sering merasa ada semacam ironi. Membingungkan juga bahwa pembahasannya hanya dibatasi pada pengembangan frontend. Di Microsoft juga pernah dibuat virtual file system agar Git bisa digunakan seperti Subversion, tetapi sedihnya itu tidak menjadi umum.
Entah kenapa belakangan ini rasanya makin kuat bahwa teknologi itu berputar dan kembali lagi. Kadang saya jadi berpikir, "Lho, bukannya ini yang dulu kurang bagus itu ya?" ... Mungkin saya sudah terlalu lama berkecimpung di sini. Hiks.