前置き
PHP や Ruby で開発をしていると普段あまり意識をすることがありませんが, PHP などとは違い, Goでは当然のことながらビルドを行わないとソースの変更は反映されません.
go run xxx.go と都度コマンドを打つのも一つの手ですが, 都度行うと手間です.
realize を使うことで, この面倒な問題を解決し, ホットリロードを実現してくれます.
Quickstart
go get github.com/oxequa/realize
$ realize start
ctl+C で起動を停止してみます.
すると, プロジェクトルートに .realize.yaml という設定ファイル出来ています.
.realize.yaml を編集し go run コマンドを監視してみましょう.
go run をウォッチしてみる
settings:
  legacy:
    force: false
    interval: 0s
schema:
- name: realize
  path: .
  commands: 
    run:           # 追記
      status: true # 追記
  watcher:
    extensions:
    - go
    paths:
    - / 
    ignored_paths:
    - .git
    - .realize
    - vendor
example
Hello World!! を表示する簡単なコードで試してみる
project
└── main.go
package main
import (
	"fmt"
	"log"
	"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "\Hello World/")
}
func main() {
	log.Print("test print")
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}
Watchする
$ realize start
% curl http://localhost:8080/
\Hello World/
ソースを変更してみると...
[00:33:54][REALIZE] : GO changed /Users/xxx/go/src/github.com/xxx/realize/main.go
[00:33:54][REALIZE] : Install started
[00:33:55][REALIZE] : Install completed in 1.005 s
[00:33:55][REALIZE] : Running..
[00:33:55][REALIZE] : 2018/12/26 00:33:55 test print
再度, curlで確認してみると結果が反映されていることが分かります.
curl http://localhost:8080/
Hello World!!!
Realize を組み合わせることで, 開発時の煩わしいビルド作業を意識することなく開発することが出来そうです.
あでゅ
※ 追記: 私のプロジェクトでは, まだ dep を使用しているので問題なく使えておりますが, 「Realize が Go 1.11 の Modules で使えない」
といった報告もあるようです