Air是Go语言生态中专注本地开发的热重载工具,解决手动编译重启导致的效率低下与开发中断问题;它监听代码变更后自动构建并重启进程,实现保存即生效的快速反馈循环。

air 是什么,它解决什么问题
air 是一个 Go 语言生态中轻量、专注的热重载工具,核心作用是:代码保存后自动构建并重启进程,跳过手动 go run 或 go build && ./xxx 的重复操作。它不替代 go test 或构建流水线,只服务于本地开发阶段的快速反馈循环。
常见错误现象包括:改了 main.go 却没看到输出更新、终端卡在旧进程、air 报错说找不到 main 函数——这些基本都源于配置或项目结构不匹配,而非工具本身失效。
使用场景很明确:你正在写 Web 服务(如 gin、echo)、CLI 工具或任何需要频繁启停验证逻辑的 Go 程序,且希望保存即生效。
怎么装、怎么跑、为什么不能直接 go install
air 官方推荐用 curl + go install 组合安装,但要注意 Go 版本和模块路径:
立即学习“go语言免费学习笔记(深入)”;
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- Go 1.21+ 用户应运行:
curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s -- -b $(go env GOPATH)/bin
- 若用
go install,必须指定 commit hash 或 tag,因为主分支的main.go可能不兼容最新 Go:go install github.com/cosmtrek/air@v1.47.1
- 安装后执行
air报command not found?检查$(go env GOPATH)/bin是否在$PATH中 -
air默认找当前目录下的main.go;如果入口文件不在根目录(比如在cmd/myapp/main.go),需用-c指定配置文件,或加-d cmd/myapp
air.toml 配置里最关键的三项
air.toml 不是必须的,但一旦项目结构稍复杂(多包、非标准入口、需要忽略日志文件),就必须配。容易被忽略的坑集中在以下三个字段:
-
root:不是工作目录,而是 Go 模块根路径。若go.mod在./backend下,root = "./backend",否则air找不到依赖 -
build.bin:生成的二进制名。默认是air,但如果你的程序用了os.Args[0]做路径判断(比如加载 config.yaml),建议设为真实名:bin = "./myserver" -
build.exclude_dir:务必加上["node_modules", ".git", "vendor"],否则保存前端文件也会触发重启,白白浪费 CPU
示例最小可用配置:
[build] bin = "./myapp" cmd = "go build -o ./myapp ." exclude_dir = ["node_modules", ".git", "vendor"] include_ext = ["go", "mod", "sum"]
修改代码后不重启?先查这三件事
这不是 bug,90% 是环境或配置链路断了:
- 确认你改的是被
air监听的文件:include_ext里没加.tmpl或.yaml?那改模板或配置不会触发 - 检查终端是否卡在旧进程:
air重启时会 kill 上一个 PID,但如果程序没正常退出(比如 goroutine 挂起、http.ListenAndServe阻塞未处理 signal),旧进程可能残留,新进程 bind 端口失败,报address already in use - Windows 用户注意:
air在 WSL2 下表现稳定,但在原生 CMD/PowerShell 中,某些杀进程逻辑会失败,建议统一用git bash或WSL2
真正复杂的点在于信号传递和进程生命周期管理——air 本身不干预你的代码怎么退出,它只负责发 SIGTERM 并等几秒后强杀。如果你的 main 函数没监听 os.Interrupt 或没做 graceful shutdown,就容易卡住。

















