🥴
Go言語のホットリロードするためのツール「Air」を紹介
はじめに
株式会社ラクーンホールディングスの技術戦略部に所属しているK1mu21です!
自分は業務でJava,PHPを触っているのですが、大学生の時はGo言語を主に触っていました
特にGo言語の初学者の方に使っていただきたいツールなので今回ご紹介します!
この記事を読んでほしい方
- Go言語で開発されている方
- Go言語初心者の方
- Astroのようにファイルを保存したら修正内容を簡単に反映したいと思っている方
Airとはなんぞや?
-
AirはGo言語でもホットリロード機能を提供するツールになります
- ファイルを保存するだけでその内容を反映させてくれるツールです
Airの導入方法
- 今回はコンテナを利用した導入方法で紹介します
- 前提条件
- Go 1.22以上の環境
- Docker Engine v26.0.0以上の環境
- 前提条件
-
go install
でairを導入します
go install github.com/air-verse/air@latest
- プロジェクトのルートディレクトリで下記コマンドを実行し、デフォルト状態の
.air.toml
ファイルを作成します(用意しなくてもいいですがその場合はデフォルトの設定が適用されます)
air init
3.air.toml
ファイルと同じディレクトリにDockerファイルを用意します
dockerfile
FROM golang:1.22.2-bullseye as dev
WORKDIR /app
RUN go install github.com/cosmtrek/air@latest
CMD ["air"]
-
air.toml
ファイルと同じディレクトリにDockerComposeファイルを用意します
docker-compose.yaml
services:
app:
image: air-example
build:
args:
- target=dev
volumes:
- .:/app
ports:
- "8080:8080"
-
docker compose up
コマンドを実行してAirのコンテナを立ち上げます
実行結果
- 以下のようにAIRという文字がコンソール画面に表示されれば成功です!
app-1 | __ _ ___
app-1 | / /\ | | | |_)
app-1 | /_/--\ |_| |_| \_ v1.51.0, built with Go go1.22.2
app-1 |
app-1 | watching .
app-1 | !exclude tmp
app-1 | building...
app-1 | running...
app-1 | [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
app-1 |
app-1 | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
app-1 | - using env: export GIN_MODE=release
app-1 | - using code: gin.SetMode(gin.ReleaseMode)
app-1 |
app-1 | [GIN-debug] GET /example --> main.main.func1 (3 handlers)
app-1 | [GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
app-1 | Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
app-1 | [GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
app-1 | [GIN-debug] Listening and serving HTTP on :8080
実際にコードを変更してみた
- コード変更前
main.go
func main() {
r := gin.Default()
r.GET("/example", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "hello",
})
})
r.Run()
}
curl http://localhost:8080/example
{"message":"hello"}%
- コード変更後ファイル保存
main.go
c.JSON(200, gin.H{
"message": "world",
})
curl http://localhost:8080/example
{"message":"world"}%
- 上記のように
Hello
の部分がworld
へ保存しただけで変更されることが確認できました - 保存するだけでコードが反映されるようになったので、Goでもホットリロード機能の導入ができました!
おわりにorまとめ
- いちいちビルドをし直す手間が省けるようになったので、劇的ではありませんが開発効率は上がることが実感できると思います
- そこまで導入も手間ではないので、とりあえず入れてみるレベルでも十分に使えるのがいい点だと思っています!
- 規模が大きいほど
.air.toml
で監視の対象から除外などの設定を行わないと、無駄なgo build
を走らせてしまうなどの問題も発生するので注意が必要です - 今回の方法だと常にDockerコンテナを立てておく必要があるため、PCの動作が重くなったりする可能性があります
ぜひAirを使ってみてください!
補足
- 今回の内容を試せるリポジトリを用意しているのでぜひご活用ください
Discussion