原文链接
采用的方式是Fresh, 并通过跟docker结合的方式
watch files, 这里面ignored: assets, tmp, vendor
原理上:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| watcher, err := fsnotify.NewWatcher() if err != nil { fatal(err) }
go func() { for { select { case ev := <-watcher.Event: if isWatchedFile(ev.Name) { watcherLog("sending event %s", ev) startChannel <- ev.String() } case err := <-watcher.Error: watcherLog("error: %s", err) } } }()
|
watch使用的是fsnotify部分,然后传递到startChannel队列中,通过对startChannel的解析,然后进行分发build
核心部分的build代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| func build() (string, bool) { buildLog("Building...")
cmd := exec.Command("go", "build", "-o", buildPath(), root())
stderr, err := cmd.StderrPipe() if err != nil { fatal(err) }
stdout, err := cmd.StdoutPipe() if err != nil { fatal(err) }
err = cmd.Start() if err != nil { fatal(err) }
io.Copy(os.Stdout, stdout) errBuf, _ := ioutil.ReadAll(stderr)
err = cmd.Wait() if err != nil { return string(errBuf), false }
return "", true }
|
另一种live reload的方式
git repo
realize支持多种方式的live reload,同时,还可以针对web程序