本人是 python 开发出身的,刚开始学 gin 的时候,每次修改代码都要重新编译执行,很麻烦。python 的 web 框架(Django/Flask/Tornado)都自带热重载,修改代码之后只需要按下保存(Ctrl + S),服务就会自动重启,我想 go 应该也有类似的工具吧,于是我在 github 上找到了我想到的答案:air
安装
使用 go install
(推荐)
使用 go 1.22 或更高版本:
go install github.com/air-verse/air@latest
可能会遇到的坑
网上有些教程可能因为年代比较久远,流传以下这个版本的安装方式:
go install github.com/cosmtrek/air@latest
本人被坑过 - -。执行之后会报以下错误:
➜ ~ go install github.com/cosmtrek/air@latest
go: github.com/cosmtrek/air@latest: github.com/cosmtrek/air@v1.52.3: parsing go.mod:
module declares its path as: github.com/air-verse/air
but was required as: github.com/cosmtrek/air
导致以上执行结果的原因是因为,官方在升级打包的时候搞错了标签(v1.21.2),尽管很快删掉了,但是却被 goproxy.cn 给缓存了下来,之后发布的版本(v.1.12.X)虽然名义上是新版本,但是由于数字上都小于问题版本,结果导致是用 goproxy.cn 的用户在 go get 安装的时候加 -u 选项也得不到新版本。让各个代理都删除错误版本显然并不现实,毕竟除了 goproxy.cn 还有 goproxy.io 等很多代理都可能有问题。
只需要按照官网最新的文档安装就行了。
使用方法
基本使用
- 最简单的方法是执行
# 优先在当前路径查找 `.air.toml` 后缀的文件,如果没有找到,则使用默认的
air -c .air.toml
- 您可以运行以下命令,将具有默认设置的
.air.toml
配置文件初始化到当前目录。
air init
- 在这之后,你只需执行
air
命令,无需额外参数,它就能使用.air.toml
文件中的配置了。
air
如欲修改配置信息,请参考 官方配置说明 文件.
官网的是英文版,如果大家读起来有困难,也给大家安排了翻译版
# Config file for [Air](https://github.com/air-verse/air) in TOML format
# air 的工作目录
# 当前文件夹的相对路径(.)或者绝对路径, 请注意,tmp_dir必须位于根目录下.
root = "."
tmp_dir = "tmp"
[build]
# 每次构建前要运行的命令数组
pre_cmd = ["echo 'hello air' > pre_cmd.txt"]
# 构建命令。你也可以使用“make”.
cmd = "go build -o ./tmp/main ."
# 退出之后要运行命令数组
post_cmd = ["echo 'hello air' > post_cmd.txt"]
# 构建命令生成的二进制文件
bin = "tmp/main"
# 自定义二进制文件,可以在运行应用程序时设置环境变量。
full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"
# 运行二进制文件(bin/full_bin)时添加其他参数。例如:tmp/main hello world。
args_bin = ["hello", "world"]
# 包含的文件扩展名。
include_ext = ["go", "tpl", "tmpl", "html"]
# 忽略这些文件扩展名或目录。
exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules"]
# 包含的目录。
include_dir = []
# 包含的文件。
include_file = []
# 排除文件。
exclude_file = []
# 排除特定的正则表达式。
exclude_regex = ["_test\\.go"]
# 排除未更改的文件。
exclude_unchanged = true
# 按照符号链接查找目录
follow_symlink = true
# air 的日志文件,放在 tmp_dir 中。
log = "air.log"
# 轮询文件是否修改,而不是使用 fsnotify。
poll = false
# 轮询间隔(默认最小间隔为500ms)。
poll_interval = 500 # ms
# 如果文件更改过于频繁,则不必每次都触发构建。
delay = 0 # ms
# 发生构建错误时停止运行旧的二进制文件。
stop_on_error = true
# 在终止进程之前发送中断信号(windows不支持此功能)
send_interrupt = false
# 发送中断信号后的延迟
kill_delay = 500 # nanosecond
# 是否重新运行二进制文件
rerun = false
# 每次执行后的延迟
rerun_delay = 500
[log]
# 显示日志时间
time = false
# 仅显示主日志(watch、build、run)
main_only = false
[color]
# 自定义颜色。如果没有找到颜色,请使用原始应用程序日志。
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"
[misc]
# 退出时删除tmp目录
clean_on_exit = true
[screen]
clear_on_rebuild = true
keep_scroll = true
# 在浏览器上启用实时重新加载。
[proxy]
enabled = true
proxy_port = 8090
app_port = 8080
安装成功后启动会显示以下信息
Docker 用户安装和使用指南
Dockerfile
# 选择你想要的版本,>= 1.16
FROM golang:1.22-alpine
WORKDIR /app
RUN go install github.com/air-verse/air@latest
COPY go.mod go.sum ./
RUN go mod download
CMD ["air", "-c", ".air.toml"]
docker-compose.yaml
version: "3.8"
services:
web:
build:
context: .
# 修改为你的 Dockerfile 路径
dockerfile: Dockerfile
ports:
- 8080:3000
# 为了实时重载,将代码目录绑定到 /app 目录是很重要的
volumes:
- ./:/app