Airとは何か
Airは、Goで実装したアプリケーションをホットリロードしてくれるツールです。
インストール
下のコマンドでインストールします。
go install github.com/air-verse/air@latest
GOPATHを繋いでなかったら繋ぐようにしてください。
export PATH=$PATH:$(go env GOPATH)/bin
.air.tomlファイルを準備する
Airにホットリロードさせるために必要なファイルを準備します。
下のコマンドで初期化します。
air init
すると、下のような.air.toml
が生成されます。
これを作業ディレクトリ上に配置します。
root = "."
testdata_dir = "testdata"
tmp_dir = "tmp"
[build]
args_bin = []
bin = "./tmp/main"
cmd = "go build -o ./tmp/main ."
delay = 1000
exclude_dir = ["assets", "tmp", "vendor", "testdata"]
exclude_file = []
exclude_regex = ["_test.go"]
exclude_unchanged = false
follow_symlink = false
full_bin = ""
include_dir = []
include_ext = ["go", "tpl", "tmpl", "html"]
include_file = []
kill_delay = "0s"
log = "build-errors.log"
poll = false
poll_interval = 0
post_cmd = []
pre_cmd = []
rerun = false
rerun_delay = 500
send_interrupt = false
stop_on_error = false
[color]
app = ""
build = "yellow"
main = "magenta"
runner = "green"
watcher = "cyan"
[log]
main_only = false
time = false
[misc]
clean_on_exit = false
[proxy]
app_port = 0
enabled = false
proxy_port = 0
[screen]
clear_on_rebuild = false
keep_scroll = true
実際に使ってみる
今回試しに下のようなmain.goを準備しました。
package main
import (
"fmt"
"net/http"
)
func main() {
fmt.Println("Hello, World!")
http.ListenAndServe(":8080", nil)
}
下のコマンドで実行してみます。
air -c .air.toml
実行がうまくいくと下のように表示されます。
__ _ ___
/ /\ | | | |_)
/_/--\ |_| |_| \_ v1.60.0, built with Go go1.23.2
watching .
!exclude tmp
building...
running...
Hello, World!
ここでmain.goのファイルを下のように修正します。
Hello, World!
の!を3つに増やしました。
package main
import (
"fmt"
"net/http"
)
func main() {
fmt.Println("Hello, World!!!")
http.ListenAndServe(":8080", nil)
}
そうすると下のように際ビルドされます。
main.go has changed
building...
running...
Hello, World!!!
dockerファイルを準備する
Airはdockerと一緒に使用されることが多いと思います。
なのでdockerでもAirを使ってホットリロードできるようにしようと思います。
下のようなDockerfileを準備します。
FROM golang:1.23-alpine
RUN go install github.com/air-verse/air@latest
WORKDIR /app
COPY . .
RUN go mod download
CMD ["air", "-c", ".air.toml"]
加えてdocker-compose用のymlファイルを準備します。
services:
server:
build:
context: .
dockerfile: ./docker/go/Dockerfile
tty: true
depends_on:
- db
ports:
- 8080:8080
# airに必要
volumes:
- .:/app
dockerでホットリロードを使うには、ボリュームのマウントが必要になります。
dockerでは起動コマンドにair -c .air.toml
を指定しているので、docker compose
コマンドを使用します。
docker compose up --build
airがしっかり導入できていれば、下のように表示されます。
server-1 |
server-1 | __ _ ___
server-1 | / /\ | | | |_)
server-1 | /_/--\ |_| |_| \_ v1.60.0, built with Go go1.23.2
server-1 |
server-1 | watching .
ぜひ活用してみてください!