In revision control systems, a monorepo (syllabic abbreviation of monolithic repository) is a software development strategy where code for many projects is stored in the same repository. As of 2017 this software engineering practice was over a decade old, but had only recently been named.
- Hammant, Paul; Smith, Steve. "Trunk Based Development".
Pernahkah kalian develop beberapa aplikasi dan menemukan dari aplikasi - aplikasi tersebut ada fungsi sama yang dipakai secara berulang - ulang? Cara paling gampangnya yaitu dengan cara copy paste betul kan?
Hanya saja problem yang akan terjadi adalah jika si code itu mengalami perubahan, berarti kita harus copy paste ulang source code ke berbagai repo. Ini membuat development menjadi kurang efisien dan terkesan terlalu manual.
Monorepo
Seperti yang telah disebutkan di awal artikel, monorepo menyatukan beberapa project di dalam satu repo, sehingga bisa menggunakan shared lib untuk menambah efisiensi development.
Contoh framework monorepo yang cukup terkenal di Javascript adalah Lerna. Kami di eFishery sudah menggunakan Lerna dan impact yang kami rasakan cukup positif.
Golang
Mungkin kalian pernah mendengar Golang yang sekarang sedang hype untuk bahasa pemrograman di backend. Lebih lanjut tentang golang bisa di cek disini.
Setelah mencari - mencari di github, stack-overflow, dll. kami menyadari tidak ada framework golang untuk monorepo yang work out of the box semacam Lerna. Dan pada akhirnya kita menemukan pencerahan melalui golang submodule.
Solusinya
Dengan menggunakan submodule, kita bisa membuat masing - masing service dan rootnya yang digunakan sebagai shared lib mempunyai dependencies sendiri. Contoh simplenya katakanlah kita punya kumpulan go module seperti ini:
- root (untuk shared lib)
- service a
- service b
Struktur folder
Struktur foldernya bisa digambarkan seperti ini:
Jadi, tiap service akan dependent ke root module yaitu shared lib, cara mendaftarkan root module sebagai dependencies adalah dengan cara replace
Build
Tidak ada perubahan yang besar dari cara build, kita cukup masuk ke folder source codenya si service dan run go build
dari sana. Module root juga akan otomatis terintegrasi pada saat build service sehingga kita tidak perlu build root modulenya.
Penutup
Mungkin artikel akan ada kelanjutannya karena kita belum berbicara tentang strategi deployment dan CI/CDnya. See you next time! and thanks for reading!