Air启动后不监听文件变化是因为默认仅监控.go文件,需在.air.toml的[watch]和[build]节均配置include_ext=["go","yaml","yml","html","tmpl"],且build.bin与build.cmd输出路径必须严格一致,改配置后须手动重启air。

为什么Air启动后不监听文件变化
Air 默认只监控 .go 文件,但实际项目中常有 config.yaml、templates/ 或 static/ 目录需要热重载。若修改配置或模板后服务没重启,大概率是监听范围没配全。
- 在项目根目录新建
.air.toml,显式声明监听路径:[monitor] include_ext = ["go", "yaml", "yml", "tmpl", "html"] include_dir = ["./config", "./templates", "./static"]
- 避免用
air -c air.toml启动时路径写错——必须确保当前工作目录是项目根目录,否则include_dir的相对路径会失效 - Windows 下路径分隔符不用转义,但某些旧版 Air 对
\识别异常,统一用/更稳妥
Air重启失败但控制台无报错
常见于编译阶段 panic(比如 init() 函数里读配置失败),Air 默认只打印构建日志的前几行,错误被截断,看起来像“卡住”了。
- 加
-d参数启动:air -d,它会输出完整构建日志,包括go build的 stderr - 检查
.air.toml中build.flag是否误加了-ldflags等导致链接失败的参数 - 若用
go:embed加载静态资源,确保嵌入路径在build.include列表里,否则 Air 编译时找不到文件
多个Go模块下Air找不到main包
当项目含 cmd/app 和 internal/ 模块时,Air 默认在当前目录找 main.go,容易报错 no Go files in current directory。
- 在
.air.toml中指定入口:[build] cmd = "go run cmd/app/main.go"
- 不要用
go build -o输出二进制再执行——这会让 Air 无法捕获编译错误,且热重载延迟变高 - 如果
cmd/app依赖./internal,确认go.mod已正确 require 本地模块,否则go run会报找不到包
Air与Gin/echo等框架的日志冲突
Air 自带彩色日志输出,而 Gin 默认也开 debug 日志,两者混在一起会导致时间戳错位、颜色乱码,甚至阻塞 stdout。
立即学习“go语言免费学习笔记(深入)”;
- 开发期关掉框架日志:Gin 用
gin.SetMode(gin.ReleaseMode);Echo 用e.Debug = false - 或者让 Air 不接管日志:在
.air.toml加[misc] clean_on_exit = true
,配合log.SetOutput(os.Stdout)统一输出流 - 注意
fmt.Println在 Air 下可能被缓冲,调试时优先用log.Println,它默认 flush
go run,它不解析 Go AST,所以对泛型、embed、cgo 的支持完全取决于你本地 go 版本——别指望低版本 Go 能靠升级 Air 解决编译问题。


















