Go modules adalah fitur baru yang ada di golang. Saat kita membuat aplikasi, biasanya kita akan menggunakan library atau dependency dari project lain. Karena sangat jarang jika membuat sebuah aplikasi dengan source code kita sendiri, biasanya kita akan membutuhkan library tambahan 3rd party. Pada golang untuk me manage library kita bisa menggunakan go modules, jika di bahasa pemrogaman lain contoh nya di php maka go modules sama dengan composer atau jika di nodejs maka sama dengan npm & yarn.
Membuat module
Untuk membuat module baru, kita bisa menggunakan perintah go mod init nama-module
. Saat kita menggunakan perintah tersebut maka golang akan secara otomatis membuat file go.mod
yang berisikan nama module dan juga versi golang yang kita gunakan. Selanjutnya jika kita telah selesai membuat module dan kita ingin merilis nya maka sangat sederhanya, karena golang terintegrasi dengan baik dengan git maka untuk merilis module kita hanya perlu membuat tag di git.
Pada artikel kali ini kita akan emmbuat dua aplikasi yang pertama adalah module dan yang kedua adalah aplikasi yang menggunakan module kita sebelumnya. Pertama yang perlu anda lakukan buat lah repository baru di github dan beri nama module nya. contohnya

Pada gambar di atas saya membuat repository baru dengan nama go-say-hello
. Setelah membuat repository copy bagian url di atas dan hilangkan https di depan dan git di belakang, kurang lebih akan menjadi seperti berikut github.com/rendyuwu/go-say-hello
. Simpanlah link ini karena akan kita gunakan untuk membuat module nantinya.
Selanjutnya buka terminal dan buat direktori baru dengan nama go-say-hello
dan masuk ke direktori tersebut, jika sudah jalankan perintah go mod init github.com/rendyuwu/go-say-hello
silakan sesuaikan nama module nya dengan repository kita sebelumnya.

Setelah command diatas dijalankan maka golang akan membuat file baru dengan nama go.mod
yang mana isinya adalah nama module dan versi golang yang digunakan saat ini.

Kemudian buat file baru say_hello.go
dan buat function SayHello
sederhana yang akan mengembalikan satring Hello
.

Pada langkah-langkah diatas kita telah selesai untuk membuat module, selanjutnya kita akan melakukan commit ke repository yang sudah di buat.

Jika sudah di commit & push, coba refresh halaman repository pada github, jika berhasil maka file module kita harusnya sudah di tambahkan ke repository yang sebelumnya masih kosong.

Selanjutnya bagaimana cara merilis versi module kita, cara nya cukup simple kita hanya perlu membuat tag pada git saja, dan pada go module biasanya kita membuat versi di awali dengan huruf v
misal jika kita akan membuat versi 1.0.0
maka saat membuat tag kita tambahkan v
di depan, contoh nya v1.0.0
.
Setelah membuat tag, selanjutnya coba push tag tersebut

Jika sudah di push, coba refresh repository kita pada github dan perhatikan pada bagian release kita sudah memiliki 1 tag.

Menambah dependency
Sebelumnya kita telah berhasil membuat module, nah bagaimana cara menggunakan module tersebut, sebenar nya caranya cukup sederhana kita bisa menggunakan command go add namaModule
. Untuk mecoba nya silakan membuat module kembali dengan nama app-say-hello
dengan cara di atas yang sudah dicoba sebelumnya.
Jika sudah membuat module, seperti biasa kita akan mendapat file go.mod

Selanjutnya jalankan command go get namaModuleSebelumnya
, untuk mendownload module tersebut agar bisa digunakan di project app-say-hello

Perhatikan output diatas, golang secara otomatis akan mendownload dan mendeteksi versi terbaru dari module nya, jadi kita tidak perlu repot lagi jika inggin menambahkan dependencies karana kita hanya perlu menggunakan comman go get
Jika sudah selesai di download, coba buka file go.mod
kembali

Perhatikan jika saat ini terdapat baris baru yang mana terdapat require ke nama module nya dan versi module saat ini. Jadi kita tidak perlu me manage ini secara manual, kita hanya perlu menggunakan go get namaModule
dan secara otomatis akan ditambahkan module tersebut ke file go.mod
.
Selanjutnya setelah download module bagaimana cara menggunakannya, cara nya sebenarnya sama seperti saat kita menggunakan package sebelumnya, kita harus melakukan import terlebih dahulu. Contohnya coba buat file main.go
pada direktori app-say-hello
dan isikan baris kode berikut.
package main
import (
"fmt"
go_say_hello "github.com/rendyuwu/go-say-hello"
)
func main() {
fmt.Println(go_say_hello.SayHello())
}

Pada baris kode di atas kita melakukan import package pada bars ke 6 namaAlias "namModule"
kemudian pada baris ke 10 kita sudah bisa melakukan pemanggilan function nya seperti biasa. Coba jalankan baris kode diatas

Upgrade module
Untuk melakukan upgrade module caranya cukup simple, kita hanya perlu membuat tag baru di git. Jadi jika kita ingin me release versi baru pada module nya maka kita hanya perlu membuat tag baru saja di git nya.
Untuk mencobanya, buka kembali file say_hello.go
pada direktori go-say-hello
, sebelumnya kita telah me release versi v1.0.0
nah selanjutnya kita akan me release versi baru yaitu v1.5.0
. Pertama lakukan perubahan kode terlebih dahulu pada baris 4 yang sebelumnya return "Hello"
menjadi return "Hello World"
.

Selanjutnya commit dan push ke master, kemudian jangan lupa juga untuk membuat tag terbarunya, jika sudah coba cek kembali repository go-say-hello
dan pastikan saat ini sudah terdpaat 2 tag.


Nah sekarang kita sudah berhasil upgrade versi dari module go-say-hello
Upgrade dependency
Setelah kita upgrade module nya, sekarang saat nya kita upgrade dependency yang ada di aplikasi nya, untuk upgrade dependency ke versi terbaru kita bisa langsung mengubah isi file go.mod
, lalu mengubah tag nya menjadi tag terbaru. Kemudian untuk mendownload versi terbaru gunakan command go get
.

Selanjutnya jalankan command go get
untuk mendownload versi dependency terbaru

Jika sudah berhasil seperti diatas, coba jalankan kembali baris kode app-say-hello
dan pastikan output nya sudah sesuai Hello World
seperti yang kita rubah pada module sebelumnya.

Major upgrade
Major upgrade biasanya terjadi dikarenakan ada perubahan pada isi kode program kita, sehingga membuatnya tidak backward compatible, artinya kode nya rusak, jadi di versi terbaru kode nya sudah bebeda dengan versi lamanya. Sebenarnya hal ini sebaik nya sangat di hindari dan jika bisa jangan dilakukan, jangan sampai kita melakukan perubahan yang lumayan besar sehingga membuat tidak backward compatible. Namun jika tidak bisa dihindari maka strategi terbaik adalah merubah nama module.
Contohnya jika merubah function SayHello
yang sebelumnya tanpa parameter menjadi memiliki parameter nama

Jika kita melakukan perubahan diatas maka kode kita akan rusak, rusak nya seperti apa, rusak nya terjadi ke orang-orang yang menggunakan module kita akan mendapat error karena sebelumnya saat menggunakan function SayHello
bisa tanpa paremeter, tetapi sekarang wajib menggunakan parameter. Walau perubahan nya hanya 1 parameter ini kita anggap major karena kode sebelumnya pasti rusak.
Idealnya saat kita melakukan major changes dan tidak bisa backward compatible, kita merubah nama module nya, jadi nama module nya kita rubah, nah biasanya di golang kita menambahkan versi di belakang nama module contohnya module github.com/rendyuwu/go-say-hello/v2

Dengan merubah nama module nya maka kita berharap orang yang masih get ke nama module sebelumnya maka akan mendapat v1 dan jika ingin mendapat versi 2 maka harus menambahkan v2 di belakang nya. Walaupun repository nya sama tidak masalah jika kita merubah nama module nya.
Selanjutnya setelah melakukan perubahan pada kode dan nama module, maka seperti biasa commit dan push ke repository, kemudian buat juga tag major changes v2.0.0

Jika sudah di push pastikan juga tag nya sudah muncul di github

Nah selanjutnya jika kita ingin menggunakan versi 2 maka saat menjalankan command go get
tambah v2 di belakang, contohnya go get github.com/rendyuwu/go-say-hello/v2
, dengan begini golang akan mengambil tag yang di depan nya v2 v2.0.0
. Untuk menggunakan versi 1 yang lama maka bisa seperti sebelumnya tanpa v2 go get github.com/rendyuwu/go-say-hello
.

Bisa dilihat tag pada go mod secara otomatis akan menggunakan v2.0.0
, karena dependency sudah di update selanjutnya lakukan perubahan pada file min.go
juga karena saat ini function SayHello
memerlukan parameter.

Lakukan perubahan pada baris 6 dan sesuaikan nama module yang sebelumnya github.com/rendyuwu/go-say-hello
menjadi github.com/rendyuwu/go-say-hello/v2
. Kemudian tambahkan juga parameter pada function SayHello
dan coba jalankan kaembali program nya.

Penutup
Pada artikel kali ini kita telah belajar tentang beberapa Go Modules pada bahasa pemrogaman golang. Dan pada artikel selanjutnya saya akan membahas Golang Unit Test yang akan terdiri dari beberapa artikel.