最近开始用 go 写后端程序,每次 go run
感觉累得要死,非常需要一个 live reload 的工具。一些框架会自带自动重启功能,比如 Buffalo,不巧的是我们没有用框架,所以就需要找一些专门的 live reload 的工具了。
社区比较流行的是 realize 这个工具,尝试用了一下,发现并不支持 go 1.11 引入的 module 机制[1]。并且似乎作者似乎已经放弃了这个项目,上一次提交已经是半年前了,对修复这个问题的 PR 也没有表态。
放弃了 realize 之后,目光转向了另一个工具 air。这个工具基本开箱即用,安装之后在项目目录里执行 air
就可以了之后就可以看到项目跑了起来,当然,没有配置的前提是项目要符合一定的规则,一般的 go 项目应该都问题不大。
不过用了一段时间之后发现,air 满足不了一些需求。例如说 air 不支持运行程序的时候带参数,自动执行测试等可能也比较复杂。幸好,我又找到了本篇文章的主角 modd。
Modd 是一个响应文件变化执行指定的命令的工具。它并没有限制我们执行什么命令,是一个相当通用的工具,可以用于各种语言、各种项目的热重启。当然,通用就决定了它并不能对项目做出过多的假设,需要我们事先进行配置才能正确地完成 live reload。
Modd 在执行时会检查名叫 modd.conf
的配置文件,例如:
**/*.go {
prep: go test ./...
daemon: go run main.go
}
之后再执行 modd
就可以完成监控文件变化并热重启了。示例可以在 https://github.com/leafduo/modd-example 找到。
我们来仔细看一下这个配置文件,首先指定了需要监控的文件的列表,这里是 **/*.go
,也就是所有子孙目录下的 go 文件。花括号中的内容是文件发生变化时执行的命令。prep
后面的命令是会执行完成的类型,例如编译、单元测试、代码生成等;damon
后面的命令是会一直执行、不会退出的命令,例如 web 服务器等。按照这个配置文件,运行 modd
之后,每次修改文件之后,modd 就会自动执行测试,并重新运行程序。
protos/**/* **/*.go !pb/**/* {
prep: go generate ./...
prep: go test ./...
daemon: go run main.go
}
再来看一个复杂一点的例子,这个例子中,我在项目中有一些 protobuf 的描述文件,我已经在代码中写好了生成相应的 go 文件的指令,只需要运行 go generate
就可以生成 .pb.go
文件在程序中使用了。 监控的文件列表中,增加了 protos/**/*
,这里面包含了 protobuf 描述文件;还有一项是 !pb/**/*
,这里排除了 pb
文件夹下的所有文件,避免自动生成的文件再次触发 reload。
总体来说,modd 是非常顺手的,配置灵活,功能完善,开发调试必备良品。
Comments