Berawal dari dunia per-NodeJS-an, aku selalu menggunakan Nodemon untuk develop aplikasi dengan NodeJS. Singkat cerita, di ak mendapatkan projek yang menggunakan Golang sebagai pengganti dari aplikasi lama, dan memuat ulang aplikasi yang kodenya sudah dimodifikasi cukup membuat repot. Karena aku harus restart Golang servernya setiap kali ada perubahan di dalam kode aplikasi.

Oleh karena itu aku mencari-cari library yang mirip dengan Nodemon. Seperti CompileDaemon, Air, Realize, bahkan melihat ulang Nodemon karena memiliki fitur melihat perubahan di binary. Awalnya aku mencoba CompileDaemon, tapi ternyata fitur live-reloadnya tidak berjalan (mungkin ada yang salah di konfigurasinya 🤷‍♂). Lalu aku juga mencoba Air dan Realize, tapi library-library ini memerlukan file konfigurasi khusus supaya bisa berjalan dan ternyata kurang cocok untuk kebutuhanku. Karena yang aku butuhkan adalah library yang bisa dijalankan tanpa perlu ada file konfigurasi khusus (CompileDaemon tidak perlu file konfigurasi, tapi entah kenapa fitur live-reloadnya tidak berjalan).

Setelah mencari lebih jauh, ternyata ada library lain yang bernama Gin. Simpel tapi cukup powerful. Mirip seperti CompileDaemon tapi ada fitur tambahan seperti notifikasi desktop. Aku suka dengan fitur ini karena Gin akan mengirimkan notifikasi ke desktop setiap kali ada perubahan atau setiap kali kita melakukan penyimpanan di kode kita.

Berikut adalah parameter-parameter yang bisa kita pakai di Gin

   --laddr value, -l value       listening address for the proxy server
   --port value, -p value        port for the proxy server (default: 3000)
   --appPort value, -a value     port for the Go web server (default: 3001)
   --bin value, -b value         name of generated binary file (default: "gin-bin")
   --path value, -t value        Path to watch files from (default: ".")
   --build value, -d value       Path to build files from (defaults to same value as --path)
   --excludeDir value, -x value  Relative directories to exclude
   --immediate, -i               run the server immediately after it's built
   --all                         reloads whenever any file changes, as opposed to reloading only on .go file change
   --godep, -g                   use godep when building
   --buildArgs value             Additional go build arguments
   --certFile value              TLS Certificate
   --keyFile value               TLS Certificate Key
   --logPrefix value             Setup custom log prefix
   --notifications               enable desktop notifications
   --help, -h                    show help
   --version, -v                 print the version

Catatan: Salah satu kekurangan dari Gin adalah dia memerlukan proxy server sebagai entrypoint ke aplikasi kita.

Contoh

Menjalankan server Go di port 8080

Pada contoh berikut, Gin akan membuat proxy server di port 3000 (port default dari Gin) dan proxy server tersebut akan meneruskan request ke port aplikasi Golang kita di port 8000.

# This will run all main package
$ gin --appPort 8080

## Output
[gin] Listening on port 3000
[gin] Building...
[gin] Build finished

Menjalankan server Go di port 8080 dan proxy server di port 5000

Pada contoh berikut, Gin akan membuat proxy server di port 5000 dan proxy server tersebut akan meneruskan request ke port aplikasi Golang kita di port 8000.

# This will run all main package
$ gin --appPort 8080 --port 5000

## Output
[gin] Listening on port 5000
[gin] Building...
[gin] Build finished

Menjalankan server Go langsung setelah Gin build berhasil

Ada beberapa orang yang mengalami masalah dimana setelah Gin berhasil membuat ulang binary, mereka tidak bisa langsung mengirimkan API request ke proxy server Gin. Ini dikarenakan Gin menggunakan time.Sleep(100 * time.Millisecond) di fungsi build yang ada di dalamnya. Kita bisa menyiasati ini dengan menggunakan flag --immediate supaya proxy server akan langsung dijalankan setiap kali Gin berhasil membuat ulang binary aplikasi kita.

# This will run all main package
$ gin --appPort 8080 --port 5000 --immediate

# or
$ gin --appPort 8080 --port 5000 -i

## Output
[gin] Listening on port 5000
[gin] Building...
[gin] Build finished

Mengirimkan notifikasi desktop

Ini salah satu fitur yang aku suka dari Gin. Dengan notifikasi desktop ini kita bisa tahu apakah build binary aplikasi kita berhasil atau gagal tanpa harus bolak-balik pindah dari IDE dan terminal kalian. Kita bisa menggunakan flag --notifications.

# This will run all main package
$ gin --appPort 8080 --port 5000 --immediate --notifications

## Output
[gin] Listening on port 5000
[gin] Building...
[gin] Build finished

Preview

Build started Build started
Build success Build success
Build failed Build failed