Skip to content
gqlxj1987's Blog
Go back

Hot Reloading Go Programs

Edit page

原文链接

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

git repo

realize支持多种方式的live reload,同时,还可以针对web程序


Edit page
Share this post on:

Previous Post
Flipkart Data Platform
Next Post
devops一周总结