Go開発では、コードの変更ごとに手動でビルドと再起動を繰り返すことが一般的ですが、この手順は開発効率を著しく低下させます。リアルタイム再読み込み(hot-reload)ツールであるAirは、ソースコードの変更を自動検知し、アプリケーションを再コンパイル・再起動することで、この手間を解消します。
Airとは
AirはGo言語専用の開発支援ツールで、ファイル変更を監視して自動でビルド・再起動を実行します。他のツールと比較して、設定がシンプルで、起動が高速、かつOS間の互換性に優れています。特に、WebサーバーやAPIの開発において、コード修正と結果の確認のサイクルを数秒以内に短縮できます。
インストールと初期設定
以下のコマンドでAirをインストールします:
go install github.com/cosmtrek/air@latest
インストールが完了したら、バージョンを確認:
air --version
プロジェクトのルートディレクトリで、設定ファイルを生成します:
air init
これにより、.air.tomlファイルが生成されます。以下は典型的な設定例です:
# .air.toml
root = "."
tmp_dir = "tmp"
[build]
bin = "./bin/server"
cmd = "go build -o bin/server main.go"
[watch]
extensions = ["go", "html", "tmpl", "json"]
exclude_dir = ["tmp", "vendor", ".git"]
include_dir = ["internal", "pkg"]
[log]
time = true
この設定では、main.goと関連するテンプレート・設定ファイルの変更を監視し、ビルド結果はbin/serverに出力されます。監視対象外のディレクトリ(例:vendor)は除外することで、不要な再コンパイルを防ぎます。
リアルタイム再読み込みの実行
設定ファイルを用意したら、プロジェクトルートで以下のコマンドを実行:
air
Airはバックグラウンドでファイルシステムの変更を監視し、.goや指定された拡張子のファイルが保存されると、自動でビルドをトリガーします。ビルドが成功すれば、既存のプロセスを終了し、新しいバイナリを起動します。エラーが発生した場合は、コンソールにエラーメッセージを表示し、前のプロセスを維持します。
内部動作の仕組み
Airのリアルタイム再読み込みは、以下のステップで動作します:
- ファイル監視:fsnotifyライブラリを用いて、監視対象ディレクトリ内のファイル変更をリアルタイムで検知。
- 差分ビルド:変更されたファイルのみを対象に
go buildを実行。全ソースの再コンパイルを避けて高速化。 - プロセス切り替え:新バイナリの生成が完了すると、既存のプロセスをSIGTERMで終了し、直ちに新プロセスを起動。
- エラーハンドリング:ビルドに失敗した場合、起動を中止し、前回の正常な状態を維持。開発中のサービスが停止することを防ぎます。
この仕組みにより、コード保存からアプリ再起動までの時間が通常1秒以内に収まり、開発者の集中力を維持できます。
主な適用シーン
- Webアプリケーション開発:HTMLテンプレートやJSON設定の変更も監視可能で、フロントエンドとバックエンドの連携テストがスムーズに。
- REST/gRPC API開発:エンドポイントの追加やリクエスト処理の修正を即座に確認可能。
- プロトタイピング:アイデアを素早く検証したい場合、手動再起動のオーバーヘッドを排除できます。
AirはGoの開発ワークフローを根本から変えるツールであり、設定は最小限で、効果は非常に大きいです。本番環境では使用しませんが、開発環境での生産性向上には不可欠です。