goland中运行air提示“不是内部或外部命令”是path未生效,需将$home/go/bin(windows为c:users{user}goin)加入用户级path并重启goland;启动后不重建则需严格对齐root路径、build.bin与build.cmd输出路径、[watch]与[build]中include_ext配置三者。

GoLand 里直接跑 air 就能热重载,但 90% 的失败不是工具问题,而是工作目录、.air.toml 配置或权限没对齐。
为什么在 GoLand 终端输 air 却提示“不是内部或外部命令”
这是 PATH 没生效的典型表现,不是安装失败。
- 用
go install github.com/air-verse/air@latest安装后,二进制实际落在C:Users\goinir.exe(Windows)或$HOME/go/bin/air(macOS/Linux) - 必须把该路径加进用户级
PATH环境变量——GoLand 启动时只读取启动那一刻的环境变量,改完 PATH 后要完全关闭并重启 GoLand,不能只关 Terminal 标签页 - 临时验证:在 GoLand Terminal 里执行
C:Users\goinir.exe -v,能出版本号就说明安装和路径都对,只是 PATH 没刷进来
air 启动了但改代码不重建?检查三个硬对齐点
Air 不是靠猜路径,它严格依赖 root、build.bin 和 [watch] include_ext 三者一致。错一个,就静默失效。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
-
root = "."必须指向含go.mod的目录,不是main.go所在目录。比如项目结构是./cmd/api/main.go+./internal/handler/,你却在cmd/api/下运行air,那internal/的改动根本不会被扫描 -
build.cmd和build.bin必须完全匹配。例如cmd = "go build -o ./tmp/main .",那bin就得是"./tmp/main",少个.或多层../都会报exec: "./tmp/main": file does not exist -
[watch] include_ext和[build] include_ext必须一模一样。想让config.yaml触发重建,就得在两处都写include_ext = ["go", "yaml", "yml"];漏掉[build]这一节,改了 YAML 也不会触发go build
Windows 下 fork/exec ./tmp/main: permission denied 怎么办
这不是杀毒软件拦截,是 Windows 对临时目录下生成的可执行文件默认不设执行权限,尤其当 tmp 在项目内时更常见。
- 最稳解法:把
build.cmd改成"go build -o ./tmp/main . && chmod +x ./tmp/main"(PowerShell 也认chmod) - 或者换输出路径,用绝对路径避开项目内
tmp目录,比如bin = "C:/tmp/main",并在build.cmd里对应写死 - 别用
. mpmain这种反斜杠写法——Air 内部路径解析器只认正斜杠/,哪怕在 PowerShell 里写也会监听失效
改了代码,终端显示 building → running,但浏览器刷新还是旧逻辑
大概率是 HTTP keep-alive 复用连接,请求被内核转给了还没彻底退出的旧进程,不是 Air 没起作用。
- 开发期在
http.Server启动前加一行:srv.SetKeepAlivesEnabled(false),强制每次请求建新连接 - 测试时别依赖浏览器刷新,用
curl -H "Connection: close" http://localhost:8080验证最准 - 如果用了
embed.FS加载模板,改templates/文件本身不会触发重建——得改一个.go文件(哪怕加个空行),才能让 embed 重新打包
真正卡住人的从来不是 air 装不上,而是它跑起来了却“假装没反应”:路径错一层、配置漏一节、权限差一位,都会导致构建产物找不到、进程杀不干净、监听范围没覆盖——这些细节不手动验证一遍,光看文档是绕不出去的。










