Pada bagian ini kita akan belajar cara pemanfaatan vendoring untuk menyimpan dependensi di lokal.
Vendoring di Go merupakan kapabilitas untuk mengunduh semua dependency atau 3rd party, untuk disimpan di lokal dalam folder project, dalam folder bernama vendor
.
Dengan adanya folder tersebut, maka Go tidak akan lookup 3rd party ke cache folder, melainkan langsung mempergunakan yang ada dalam folder vendor
. Jadi tidak perlu download lagi dari internet.
Ok lanjut.
Kita akan coba praktekan untuk vendoring sebuah 3rd party bernama gubrak.
Buat folder project baru dengan nama belajar-vendor
dengan isi satu file main.go
. Lalu go get library gubrak.
mkdir belajar-vendor
cd belajar-vendor
go mod init belajar-vendor
go get -u github.com/novalagung/gubrak/v2
Isi main.go
dengan blok kode berikut, untuk menampilkan angka random dengan range 10-20.
package main
import (
"fmt"
gubrak "github.com/novalagung/gubrak/v2"
)
func main() {
fmt.Println(gubrak.RandomInt(10, 20))
}
Setelah itu jalankan command go mod vendor
untuk vendoring 3rd party library yang dipergunakan, dalam contoh ini adlah gubrak.
Bisa dilihat, sekarang library gubrak source code-nya disimpan dalam folder vendor
. Nah ini juga akan berlaku untuk semua library lainnya yg digunakan jika ada.
Untuk membuat proses build lookup ke folder vendor, kita tidak perlu melakukan apa-apa, setidaknya jika versi Go yang diinstall adalah 1.14 ke atas. Maka command build maupun run masih sama.
go run main.go
go build -o executable
Untuk yg menggunakan versi Go dibawah 1.14, penulis sarankan untuk upgrade. Atau bisa gunakan flag -mod=vendor
untuk memaksa Go lookup ke folder vendor
.
go run -mod=vendor main.go
go build -mod=vendor -o executable
Manfaat vendoring adalah pada sisi kompatibilitas dan kestabilan 3rd party. Jadi dengan vendor, misal 3rd party yang kita gunakan di itu ada update yg sifatnya tidak backward compatible, maka aplikasi kita tetap aman karena menggunakan yang ada dalam folder vendor
.
Jika tidak menggunakan vendoring, maka bisa saja saat go mod tidy
sukses, namun sewaktu build error, karena ada fungsi yg tidak kompatibel lagi misalnya.
Untuk penggunaan vendor apakah wajib? menurut saya tidak. Sesuaikan kebutuhan saja.