🥴

Go言語のホットリロードするためのツール「Air」を紹介

2024/08/14に公開

はじめに

株式会社ラクーンホールディングスの技術戦略部に所属しているK1mu21です!
自分は業務でJava,PHPを触っているのですが、大学生の時はGo言語を主に触っていました

特にGo言語の初学者の方に使っていただきたいツールなので今回ご紹介します!

この記事を読んでほしい方

  • Go言語で開発されている方
  • Go言語初心者の方
  • Astroのようにファイルを保存したら修正内容を簡単に反映したいと思っている方

Airとはなんぞや?

  • AirはGo言語でもホットリロード機能を提供するツールになります
    • ファイルを保存するだけでその内容を反映させてくれるツールです

https://github.com/air-verse/air

Airの導入方法

  • 今回はコンテナを利用した導入方法で紹介します
    • 前提条件
      • Go 1.22以上の環境
      • Docker Engine v26.0.0以上の環境
  1. go installでairを導入します
go install github.com/air-verse/air@latest
  1. プロジェクトのルートディレクトリで下記コマンドを実行し、デフォルト状態の.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"]
  1. air.tomlファイルと同じディレクトリにDockerComposeファイルを用意します
docker-compose.yaml
services:
  app:
    image: air-example
    build:
     args:
       - target=dev
    volumes:
      - .:/app
    ports:
      - "8080:8080"
  1. 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を使ってみてください!

補足

  • 今回の内容を試せるリポジトリを用意しているのでぜひご活用ください

https://github.com/k1mu21/AirExample

https://speakerdeck.com/k1mu21/gonoairwoshi-tutemitahua

Discussion