使用编译型语言进行开发,总是需要不断的进行这样一个循环:编码->编译->运行->调试->编码。每次改完代码,都得编译一下,然后运行,挺烦人的。因为 Go 拥有极快的编译速度,如果改完代码后自动编译、运行,看效果,这样会极大的减少“人脑 CPU” 切换的时间,正在享受 Go 编程带来的快乐!
既然这是一个痛点,自然会有很多解决方案。我在 2012 年底就尝试写了这样的工具,但之后没有维护。现在已经有更好、更成熟的工具。其中 https://github.com/oxequa/realize 这个工具有 3.3k+ star,然而我在试用时,通过 Module 的方式没法安装它,非 Module 方式没尝试,具体可以查看:https://github.com/oxequa/realize/issues/253 。
我在写知识星球《Go项目实战》的简书项目时,发现了另外一个工具:air,它能实时重新加载 Go 应用,包含编译、重启动,对于 Web 之类的项目来说带来极大的便利。本文就是介绍它的使用。
Air 作者开始用 Go 和 gin 框架中开发网站时,因为 gin 缺少实时重新加载功能,找到并尝试 fresh 这个工具,但似乎不太好用,因此打算以一种更好的方式实现一个。 终于,Air 诞生了。 此外,非常感谢 pilu,没有 fresh,就没有 air。
Air 是用于开发 Go 应用程序时,实时重新加载的命令行实用程序。 通常情况下,你只需要在项目根目录运行它,然后专注于你的代码。
截止当前(2019年11月17日),Air 的最新版本是 1.11.1。官方提供了预编译好的二进制文件,可以直接下载使用。
curl -fLo ~/air \
https://raw.githubusercontent.com/cosmtrek/air/master/bin/darwin/air
chmod +x ~/air
curl -fLo ~/air \
https://raw.githubusercontent.com/cosmtrek/air/master/bin/linux/air
chmod +x ~/air
curl -fLo C:\air.exe \
https://raw.githubusercontent.com/cosmtrek/air/master/bin/windows/air.exe
我个人更喜欢通过源码安装:(本人 Go 版本是 1.13.3)
go get -v github.com/cosmtrek/air/cmd/...
为了使用方便,请将 air 加入 PATH 中。
作者还提供了 Docker 的方式:
docker run -it --rm \
-w "<PROJECT>" \
-e "air_wd=<PROJECT>" \
-v $(pwd):<PROJECT> \
-p <PORT>:<APP SERVER PORT> \
cosmtrek/air
-c <CONF>
例如:
docker run -it --rm \
-w "/Users/xuxinhua/project/golang/jianshu" \
-v $(pwd):/Users/xuxinhua/project/golang/jianshu \
-p 2019:2019 \
cosmtrek/air
Air 使用很简单,最简单的方式是直接在项目根目录运行 air:
air
会输出如下信息:
默认情况下,air 会在当前目录查找 .air.conf 配置文件,这是一个 toml 格式的文件。如果没有找到,使用默认的配置。一般建议创建一个 .air.conf 文件,可以从 air 项目中的 air.conf.example 复制配置内容,进行一些修改。配置项都挺简单的,我就不一一介绍了,只介绍几个可能需要进行修改的,其他的有疑问可以留言交流。
1、[build] 下的 cmd 配置默认是 go build -o ./tmp/main main.go,很可能你需要修改,比如简书项目就必须修改为 go build -o ./tmp/main gitea.com/zsxq/jianshu/cmd/...;当然也可以改为其他你常用的编译方式,比如 make 等;
2、include_ext 和 exclude_dir 配置。避免监控不必要的文件和目录;
3、记得将 tmp 目录加入 .gitignore 中;
4、如果出现 watch error, open tool many files…,说明要监控的文件太多,一方面确保修改了了 include_ext 和 exclude_dir,另一方面可以通过 ulimit -n 5000 调大进程允许打开的文件数;
好项目欢迎大家 Star,也欢迎贡献代码。看看修改代码后的效果,是不是酷酷的?!