Goのホットリロード&タスクランナーツール「Realize」を導入
現場でGolangを利用することになったので、勉強用にGolangのテスト環境を作りました。
今回はホットリロードを実装するパッケージ、「Realize」を導入したのでまとめます。
ホットリロード&タスクランナーの必要性
Golangは静的型付け言語なので、プログラム実行の前にコンパイルが必要で、次のようなコマンドでビルドする必要があります。
go build -o hogehoge
開発フェーズではファイル修正が頻繁にあるため、更新のたびにビルドを実行しなければならず手間が大きい。なのでファイルの更新を検知し、自動でビルドしてくれると楽になります。
Freshなどいくつかのパッケージを調査したところ、大御所のDigital Oceanが提供しているrealizeが定期的にメンテナンスされていて良さそうでしたので、これを使います。
前準備
下記ディレクトリ構成で試します。
.
├── Dockerfile
└── app
└── main.go
Dockerfile
FROM golang:1.12-alpine
ENV GO111MODULE on
WORKDIR /go/app
COPY ./app /go/app
RUN apk --update add --no-cache git
ENV GO111MODULE on
でGo Module機能をONにしています。Go ModuleはGoの新しい依存関係管理システムで、依存関係のモジュールとバージョン情報を明示的に管理しやすくします。npmとかpipみたいなやつですね。Go1.11と1.12は準備期間として、 GO111MODULE
という環境変数でGo ModuleのON/OFFの切り替えができます。
main.go
ハローワールドを出力する簡単なコードです。
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, world!!")
})
http.ListenAndServe(":8081", nil)
}
ビルドとモジュールの初期化
# イメージビルド
docker image build -t mygo:latest .
# コンテナ起動
docker container run -dt -v $(pwd)/app:/go/app -p 8081:8081 -p 5002:5002 --name mygo mygo:latest
# コンテナへ入る
docker container exec -it mygo /bin/sh
コンテナへ入った後、main.goが置いてあるディレクトリでビルドします。
go mod init app
go build -o app
realizeの導入
パッケージのリポジトリ↓
https://github.com/oxequa/realize
# インストール
go get github.com/oxequa/realize
# プロジェクトのrootディレクトリで下記を実行
realize start
realize start
を実行すると .realize.yaml
が自動生成されます。デフォルトでは go install
が実行されるようになっているので go build
が実行されるように修正します。
...
commands:
install:
status: true
method: go build -o app
run:
status: true
method: ./app
...
参考: https://github.com/oxequa/realize/issues/217
ブラウザで http://localhost:8081/
にアクセスするとハローワールドが表示されます。
試しにmain.goのprint文を修正し保存すると、自動でrealizeがビルドを実行してくれます!
まとめ
これでGolangでの開発作業が捗ります。やったね!