Go言語でホットリロードをしたい
プログラミングをして開発をする時は、ホットリロードが使えると便利ですよね!
Go言語で開発をする時にも皆さんホットリロードを使用しているかと思います。
Go言語でホットリロードするためのソフトでは
- Realize
- Air
があります。
現在のところは、圧倒的にRealizeにシェアがあると思いますが、GitHubを見ていただくと分かる通り、開発があまり活発ではありません。(止まっていそう)
そのため今回はAirを使ったホットリロードのやり方についてまとめておきましたので参考にしてください!
GitHubレポジトリ
GitHubのレポジトリはcosmtrek/airを使用します。
前提条件
この記事に辿り着いた方達は問題ないと思いますが、事前にGo言語はインストールしておきましょう!
色々な言語を扱ったり、Goのバージョンを簡単に切り替えたい!という方は、こちらのanyenvをインストールしてGo言語をインストールする方法がオススメですので参考にしてください!
anyenvがインストールできない方や、Go言語のみをインストールしたい方は以下の記事を参考にGo言語のみをサクッとインストールしちゃいましょう!
使用方法
ローカルでGo言語が使用できる状態であれば、Airを導入することができます!
これから紹介する方法で、Airをインストールして使えるようにしていきましょう!
インストール
以下のコマンドでインストールします!
$ go get -u github.com/cosmtrek/air
PATHに入れる
まだPATHの設定がされていない場合は、airがコマンドとして使用できないので、PATHへ追加していきます!
bashを使用している場合
bashを使用している場合は、以下のファイルに記述してください。
~/.bashrc または ~/.bash_profile
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
zshを使用している場合
zshを使用している場合は、以下のファイルに記述してください。
~/.zshrc または ~/.zprofile
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
Airのインストールを確認
以下のコマンドで、Airのバージョンが表示されればOKです!
% air -v
__ _ ___
/ /\ | | | |_)
/_/--\ |_| |_| \_ v1.12.1 // live reload for Go apps, with Go1.14.0
Airを実行
以下のコマンドで打つと、Airが起動し、ホットリロードができるようになります!
$ air
実際にホットリロードさせてみる
それでは実際にホットリロードを試してみたいと思います!
サンプルでは、GoでメジャーなFWのGinを使って簡易サンプルを記述しています。
(自分のboilerplate適当にパクってきたやつなので、覚えていたらいつか素のGoに書き換えます)
もしGo Modulesなどを使用していない場合は、以下のコマンドでGinをインストールして使用してください。
Go Modulesもとても便利だと思いますので、後日記事に纏めようと思います。
$ go get -u github.com/gin-gonic/gin
Goで処理を記述する
以下のような感じで適当にサンプルコードを書きます!
Airの動作確認をしたいだけなので、とりあえず動けばなんでもOKです。
main.go
package main
import (
"fmt"
"log"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// HealthCheck
router.GET("/healthCheck", func(c *gin.Context) {
fmt.Println("test")
c.JSON(200, gin.H{
"healthCheck": "ok",
})
})
if err := router.Run(":8080"); err != nil {
log.Fatal("Server Run Failed.: ", err)
}
}
Airを起動
Airを起動して、ホットリロードの準備をします!
$ air
Goの処理を修正してみる
以下ソースコード内の「// これを追記」の部分のように、適当に処理を追加します!
すると自動で更新がされれば、ホットリロードはOKです!
main.go
package main
import (
"fmt"
"log"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// HealthCheck
router.GET("/healthCheck", func(c *gin.Context) {
fmt.Println("test")
// これを追記
fmt.Println("test")
c.JSON(200, gin.H{
"healthCheck": "ok",
})
})
if err := router.Run(":8080"); err != nil {
log.Fatal("Server Run Failed.: ", err)
}
}
設定ファイルを作成する
上記のデフォルトのままだと、プロジェクトのルート直下にGoファイルがないと、ホットリロードが動きません。
Goのディレクトリ構成のスタンダード的な感じにすると直下にmainがないので、設定ファイルを記述して、指定する必要が出てきます!
これから紹介するのは、設定の一部なので、細かい指定は本家を見て各プロジェクトに合った設定を入れてください。
.air.conf
.air.confをルート直下に置いて、以下のような感じで記述しましょう!
とりあえず、適当にsrc/main.goとして、src配下にmain.goを置く予定で設定ファイルを書きます!
.air.conf
[build]
# Just plain old shell command. You could use `make` as well.
cmd = "go build -o tmp/sample ./src/main.go"
bin = "tmp/sample"
src/main.go
src配下に置く、main.goは先ほどと同じサンプルをおきます!
これで編集してみて、ホットリロードされれば、ルート直下以外にmain.goが合ってもホットリロードできますね!
package main
import (
"fmt"
"log"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// HealthCheck
router.GET("/healthCheck", func(c *gin.Context) {
fmt.Println("test")
c.JSON(200, gin.H{
"healthCheck": "ok",
})
})
if err := router.Run(":8080"); err != nil {
log.Fatal("Server Run Failed.: ", err)
}
}
その他の設定
その他にも色々設定があるので、以下を参考にして各プロジェクトに合った細かい設定を入れてみてください!
番外編
番外編として、備忘録的な感じで記事にしておきます。
CURLを用いてAirをインストールする
macOS, Linux, Windowsで、CURLを用いてAirをインストールすることができます!
その場合は、以下のコマンドでインストールできます。
# binary will be $(go env GOPATH)/bin/air
curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s -- -b $(go env GOPATH)/bin
# or install it into ./bin/
curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s
air -v
Dockerでの使用方法
個人的には、ホットリロードツールをDocker内に含むのは好まないですが、プロジェクトなどで必要なケースもあると思うので、メモとして残しておきます。
docker run -it --rm \
-w "<PROJECT>" \
-e "air_wd=<PROJECT>" \
-v $(pwd):<PROJECT> \
-p <PORT>:<APP SERVER PORT> \
cosmtrek/air
-c <CONF>
docker run -it --rm \
-w "/go/src/github.com/cosmtrek/hub" \
-v $(pwd):/go/src/github.com/cosmtrek/hub \
-p 9090:9090 \
cosmtrek/air
まとめ
今回は、Go言語のAirでホットリロードをする方法について纏めました!
ホットリロードなどの開発の周辺ツールは後回しにしがちですが、開発効率に直結しますので、なるべく早い段階で、Goを開発する上でのMyベストプラクティスを構築して、開発を進めましょう!
コメント