DevilKing's blog

冷灯看剑,剑上几分功名?炉香无需计苍生,纵一穿烟逝,万丈云埋,孤阳还照古陵

0%

Hot Reloading Go Programs

原文链接

采用的方式是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程序