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での開発作業が捗ります。やったね!