Edited at

Realizeを使ってGoでホットリロードを実現する


前置き

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 をウォッチしてみる


realize.yaml

settings:

legacy:
force: false
interval: 0s
schema:
- name: realize
path: .
commands:
run: # 追記
status: true # 追記
watcher:
extensions:
- go
paths:
- /
ignored_paths:
- .git
- .realize
- vendor


exsample

Hello World!! を表示する簡単なコードで試してみる

project

└── main.go


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 で使えない」



といった報告もあるようです:relaxed: