Cara Generate Proto Ke Go Dengan Buf
Kenal sedikit dengan Buf
Halo semua, kali ini tulisan tentang hasil belajar beberapa hari yang lalu. Teman-teman mungkin sudah familiar dengan GRPC, dimana hal yang tidak lepas adalah menulis file proto atau mungkin bisa dibilang file yang isinya adalah contract (api) request dan response.
Untuk generate file proto ini ke golang, cara umumnya adalah yaitu dengan menggunakan bantuin clinya proto itu sendiri. Tapi ada cara yang lebih mudah lagi, yaitu dengan menggunakan buf.
Buf adalah sebuah tool yang bisa digunakan untuk generate file proto ke bahasa pemrograman yang kita inginkan. Untuk saat ini, buf sudah mendukung untuk generate ke beberapa bahasa pemrograman, seperti golang, java, php, dan lain-lain.
Persiapan
Hal pertama yaitu jangan lupa instal dahulu buf nya. Untuk cara installnya bisa dilihat di halaman berikut: https://docs.buf.build/installation. Untuk memastikan buf sudah terinstall bisa menggunakan perintah berikut:
buf version
Jadi dalam contoh project ini kita akan menggunakan golang, dan kita akan buat file proto simple.
Buat File Proto
Kita buat file proto dengan isi seperti berikut:
syntax = "proto3";
message StringMessage {
string value = 1;
}
service Greeter {
rpc SayHello (StringMessage) returns (StringMessage) {}
}
Konfigurasi Buf
Pertama kita harus inisialisasi buf dengan perintah berikut:
buf mod init
hasil dari perintah itu nantikan akan membuat satu file namanya buf.yml yang berisi konfigurasi buf. Setelahnya kita buat satu file lagi file dengan nama buf.gen.yaml yang berisi konfigurasi generate file proto ke bahasa pemrograman yang kita inginkan. Isi dari file buf.gen.yaml adalah sebagai berikut:
version: v1
managed:
enabled: true
go_package_prefix:
default: github.com/nipeharefa/belajar-proto
plugins:
- remote: buf.build/protocolbuffers/plugins/go:v1.28.0-1
out: gen/go
opt:
- paths=source_relative
Penjelasan dikit:
- plugins: ini berisi list dari plugin yang akan digunakan untuk generate file proto ke dalama bahasa peograman yang kita inginkan. Ataupun untuk generate ke output lainnya seperti swagger.
- go_package_prefix: ini dipakai untuk mengatur nama package saat generate file proto ke go.
- out: ini berisi lokasi output hasil dari generate.
Jangan lupa sesuaikan nama packagenya.
Eksekusi
Setelah konfigurasi disesuaikan maka langkah selanjutnya adalah generate ke file golangnya. Dengan cara ekskusi perintah berikut:
buf generate
Setelah berhasil maka kita akan melihat ada satu folder baru dengan nama gen dan isinya adalah hasil generate file proto tadi ke go.
Tambah Plugin GRPC
Dari hasil generate tadi masih file protobuff saja, belum termasuk file yang dibutuhkan untuk grpc. Untuk itu kita harus tambah satu plugin lagi di dalam file buf.gen.ymlnya :
- remote: buf.build/grpc/plugins/go
out: gen/go
opt:
- paths=source_relative
- require_unimplemented_servers=false
Setelah ditambahkan isi dari buf.gen.yml nya akan menjadi seperti ini:
---
version: v1
managed:
enabled: true
go_package_prefix:
default: github.com/nipeharefa/belajar-proto
plugins:
- remote: buf.build/protocolbuffers/plugins/go:v1.28.0-1
out: gen/go
opt:
- paths=source_relative
- remote: buf.build/grpc/plugins/go
out: gen/go
opt:
- paths=source_relative
- require_unimplemented_servers=false
Setelah ditambahkan maka generate ulang dengan perintah buf generate, dan perhatikan file yang dihasilkan akan bertambah.
Kesimpulan
Buf ini membantu kita untuk generate proto dengan mudah, yang dari awalnya harus menggunakan perintah yang cukup panjang. Misalnya yang ada di dokumentasi protocolbuffers
# https://developers.google.com/protocol-buffers/docs/reference/go-generated
protoc --proto_path=src \
--go_opt=Mprotos/buzz.proto=example.com/project/protos/fizz \
--go_opt=Mprotos/bar.proto=example.com/project/protos/foo \
protos/buzz.proto protos/bar.proto
tapi dengan buf kita cuman atur-atur file yaml nya saja sudah jadi. Sample code bisa dilihat di https://github.com/nipeharefa/buf-simple-example
Referensi: