使用Air实现Go程序实时热重载

使用Air实现Go程序实时热重载

在我用Go-Gin尝试 Web 开发的时候,通过 ai 进行辅助开发,在这过程中提到了一个热重载 Go 应用的工具——Air,因此尝试去理解与运用这个工具

了解后清楚,在开发过程中,频繁修改代码和重启应用程序是常见的场景,尤其是在Go开发中,程序编译速度较快,但手动重启依然会降低开发效率。为了提升开发体验,Air 工具为Go开发者提供了实时热重载(hot-reload)功能

一、Air 的优势

Air 是一个专为Go语言设计的实时热重载工具,它简单易用、功能强大,支持多种开发环境,并且性能优异。相比于其他类似工具如 Reflex(全栈开发的现代 JavaScript 框架) 或 CompileDaemon(相同的一款热加载工具,但功能较少,无法精细配置),Air 具有以下优势:

  1. 速度快Air 的编译速度非常快,能够在修改后几乎立刻重载程序。
  2. 简单配置Air 允许通过一个简单的配置文件来设置要监控的文件或目录。
  3. 跨平台:无论在Windows、Linux还是MacOS上,Air 都能顺利运行。

Air与CompileDaemon的区别

  • Air的优势在于配置灵活,支持自定义监听目录、排除文件、构造命令等高级功能,适合结构复杂或需精细控制的项目
  • CompileDaemon优势在于简单易用,无需配置文件,适合结构简单的项目
  • Air的劣势是配置较复杂,需.air.toml文件
  • CompileDaemon的劣势是功能较少,无法精细配置
  • 选择Air适用于多包结构和静态资源管理的项目
  • 选择CompileDaemon适用于单一main.go文件的简单项目

二、Air 的安装与配置

安装

使用 go install (推荐)

使用 go 1.23 或更高版本:

1
go install github.com/air-verse/air@latest

会直接下在 GOPATH 路径(默认值见 go env GOPATH

使用 install.sh

1
2
3
4
5
6
7
# binary 文件会是在 $(go env GOPATH)/bin/air
curl -sSfL https://raw.githubusercontent.com/air-verse/air/master/install.sh | sh -s -- -b $(go env GOPATH)/bin

# 或者把它安装在 ./bin/ 路径下
curl -sSfL https://raw.githubusercontent.com/air-verse/air/master/install.sh | sh -s

air -v

使用 goblin.run

1
2
3
4
5
# binary 将会安装到 /usr/local/bin/air
curl -sSfL https://goblin.run/github.com/cosmtrek/air | sh

# 自定义路径安装
curl -sSfL https://goblin.run/github.com/cosmtrek/air | PREFIX=/tmp sh

Docker/Podman

请拉取这个 Docker 镜像 cosmtrek/air.

1
2
3
4
5
6
7
docker run -it --rm \
-w "<PROJECT>" \
-e "air_wd=<PROJECT>" \
-v $(pwd):<PROJECT> \
-p <PORT>:<APP SERVER PORT> \
cosmtrek/air
-c <CONF>
Docker/Podman .${SHELL}rc

如果你想像正常应用程序一样连续使用 air,你可以在你的 ${SHELL}rc(Bash, Zsh 等)中创建一个函数

1
2
3
4
5
6
air() {
podman/docker run -it --rm \
-w "$PWD" -v "$PWD":"$PWD" \
-p "$AIR_PORT":"$AIR_PORT" \
docker.io/cosmtrek/air "$@"
}

<PROJECT> 是容器中的项目路径,例如:/go/example 如果你想进入容器,请添加 --entrypoint=bash

配置

虽然可以直接使用 Air 的默认配置,但为了更好地定制化,我们可以生成一个配置文件。Air 提供了 init 命令来生成 .air.toml 配置文件:

1
air init

生成的 .air.toml 文件包含了默认的热重载配置,开发者可以根据自己的需求进行调整。主要配置项包括:

  • cmd: 运行程序的命令
  • bin: 编译输出的二进制文件路径
  • watch_dir: 需要监听的目录或文件
  • exclude_dir: 排除不需要监听的目录
  • extensions: 监听的文件扩展名

一个常见的配置文件可能如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# .air.toml

# 工作目录
root = "."
tmp_dir = "tmp"

# 需要监控的文件类型
[watch]
extensions = ["go", "tpl", "html", "js"]

# 编译输出的二进制文件路径
[build]
bin = "bin/app"
cmd = "go build -o bin/app main.go"

启动热重载

配置完成后,只需在项目根目录运行 air 命令,Air 就会自动监控代码变更并实时重载:

1
air

每次保存代码时,Air 会自动检测到修改并重新编译运行程序,无需手动重启。

三、工作原理分析

Air 的热重载功能背后的核心原理可以分为以下几步:

  1. 文件变更监控Air 使用文件系统监听(类似于 fsnotify 库)来实时监控项目中的代码文件。当监控的文件(如 .go 文件)发生变更时,Air 会捕获到这一事件。
  2. 重新编译:在捕获到文件变更后,Air 会根据 .air.toml 中的配置自动调用 go build 命令,重新编译项目的代码,生成新的可执行文件。
  3. 重启应用:一旦新版本的可执行文件编译完成,Air 会停止当前运行的旧进程,并启动新编译的程序,从而实现实时重载效果。
  4. 增量优化Air 在重载过程中,采用了增量编译的方式,只对修改的部分文件进行编译,减少了整体的编译时间,从而提升了重载的速度。

通过这些机制,Air 能够在文件保存后几乎瞬间完成代码的重载,为开发者提供了流畅的开发体验。

四、使用场景

Air 尤其适合以下几种开发场景:

  1. Web开发:在开发Web应用时,前端和后端代码经常需要频繁修改。Air 可以实时监控后端代码,保证每次修改后都能立刻看到效果。
  2. API开发:在API开发过程中,热重载可以减少调试的中断,保持高效的开发节奏。
  3. 快速迭代开发:如果你正在进行快速的功能迭代,Air 可以极大地减少重启的操作,让开发流程更加顺

参考文献

更多用法和知识推荐官网查看

https://www.17golang.com/article/245940.html

https://www.cnblogs.com/IServise/articles/18404361


使用Air实现Go程序实时热重载
http://example.com/2025/07/08/使用Air实现Go程序实时热重载/
作者
yuhua
发布于
2025年7月8日
许可协议