概要
基于 golang Gin 框架开发 web 服务时, 需要时不时的 go build , 然后重启服务查看运行结果.
go build 的过程集成在编辑器中(emacs), 可以通过快捷键迅速完成, 但是每次重启服务都切换到命令行中操作.
因此, 希望能够编译通过之后自动重启服务.
这里并不是部署阶段的服务重启, 所以不用过多考虑是否正常退出其中的协程.
实现方式
在开源的 illuminant 项目中, 已经将相应的代码集成到 gin 的 debug mode 中.
1 func setupWatcher() (chan struct{}, error) {
2 file, err := osext.Executable()
3 if err != nil {
4 return nil, err
5 }
6 log.Printf("watching %qn", file)
7 w, err := fsnotify.NewWatcher()
8 if err != nil {
9 return nil, err
10 }
11 done := make(chan struct{})
12 go func() {
13 select {
14 case e :=
15 log.Printf("watcher received: %+v", e)
16 err := syscall.Exec(file, os.Args, os.Environ())
17 if err != nil { </