go热重载需装air-verse/air并严格配置.air.toml三字段:root指向go.mod目录、build.bin与build.cmd路径一致、两处include_ext同步;编译失败优先查go build,权限问题加chmod,非go文件需双位置配置后缀。

Go 环境搭好后,热重载不是“开箱即用”,必须装 air 并配对 .air.toml 里的三个关键字段:路径、命令、监听后缀——漏一个,air 就会静默失效或报错。
安装 air 要认准新仓库地址,旧地址已弃用
别再用 cosmtrek/air。2026 年起官方主仓库已迁移到 air-verse/air,否则可能拉到过期版本或模块解析失败:
go install github.com/air-verse/air@latest- 装完检查:
air -v应显示类似(devel), built with go go1.23.x - macOS/Linux 用户若曾用 Homebrew 装过旧版,先
brew uninstall air,否则air -v显示版本对不上,实际运行的仍是老二进制
air 启动失败,90% 是代码编译不过,不是配置问题
看到 failed to build, error: exit status 2 别急着改配置。这是 Go 编译器在报错,air 只是把错误透传出来:
- 立刻在终端执行
go build,看是否出现undefined: xxx或import cycle not allowed - 确保
go.mod在当前目录——air默认从含go.mod的目录启动,否则找不到模块根路径 - 编辑器保存瞬间文件可能没落盘,
delay = 1000别乱设成200,否则构建时读到半截文件
.air.toml 里三处必须严格一致:root、build.bin、build.cmd
配置文件写得再全,只要这三项没对齐,air 就找不到可执行文件或杀不掉旧进程:
-
root = "."必须指向含go.mod的项目根目录,不是main.go所在目录 -
build.cmd = "go build -o ./tmp/main ."和build.bin = "./tmp/main"必须完全一致;写成"tmp/main"或"./main"都会触发exec: "./tmp/main": file does not exist - Linux/macOS 上常见
fork/exec ./tmp/main: permission denied:要么./tmp目录无写权限,要么 NFS 挂载 strip 掉了执行位。稳妥做法是把build.cmd改成:go build -o ./tmp/main . && chmod +x ./tmp/main
改 config.yaml 或模板不重启?两个 include_ext 都得加
air 默认只监听 .go 文件,这不是 bug,是设计如此。想让非 Go 文件变更也触发构建,必须在 .air.toml 的两处同时配置:
-
[watch]节里:include_ext = ["go", "yaml", "yml", "html", "tmpl"] -
[build]节里也要写一模一样的include_ext,漏掉任意一节都不生效 - 注意代价:Linux 下 inotify 句柄默认上限 8192,加太多后缀容易触发
inotify limit reached;宁可少加,别堆砌 - 如果只是改文案或静态资源,更推荐程序内用
fsnotify加载模板,而不是靠air杀进程——避免 HTTP 连接中断、状态丢失
真正卡住人的地方,往往不是不会配,而是没意识到 air 的每个路径、每处后缀、每次权限都必须手动对齐;它不猜你意图,只按配置字面量执行。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











