采用的方式是Fresh, 并通过跟docker结合的方式
watch files, 这里面ignored: assets, tmp, vendor
原理上:
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代码
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的方式
realize支持多种方式的live reload,同时,还可以针对web程序