Go开发过程中总是要停下来编译:用它解决你的烦恼,快乐编程

Go开发过程中总是要停下来编译:用它解决你的烦恼,快乐编程

使用编译型语言进行开发,总是需要不断的进行这样一个循环:编码->编译->运行->调试->编码。每次改完代码,都得编译一下,然后运行,挺烦人的。因为 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 应用程序时,实时重新加载的命令行实用程序。 通常情况下,你只需要在项目根目录运行它,然后专注于你的代码。

核心特性

  • 彩色日志输出
  • 自定义构建或二进制的命令
  • 支持排除子目录
  • Air 启动后允许监控新目录
  • 更友好的构建过程

安装

截止当前(2019年11月17日),Air 的最新版本是 1.11.1。官方提供了预编译好的二进制文件,可以直接下载使用。

macOS

curl -fLo ~/air \
    https://raw.githubusercontent.com/cosmtrek/air/master/bin/darwin/air
chmod +x ~/air

Linux

curl -fLo ~/air \
    https://raw.githubusercontent.com/cosmtrek/air/master/bin/linux/air
chmod +x ~/air

Windows

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 的方式:

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

会输出如下信息:

image-20191117174524754

默认情况下,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,也欢迎贡献代码。看看修改代码后的效果,是不是酷酷的?!

欢迎关注我的公众号:

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据