Go语言实现热更新具体步骤
package main
import (
"log"
"os"
"os/exec"
"path/filepath"
"time"
"github.com/fsnotify/fsnotify"
)
func main() {
// 启动文件监听
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watcher.Close()
go watchForChanges(watcher)
// 主循环
for {
select {
case event := <-watcher.Events:
// 处理文件变化事件
if event.Op&fsnotify.Write == fsnotify.Write {
log.Println("File modified:", event.Name)
restartApp()
}
case err := <-watcher.Errors:
log.Println("Error:", err)
}
}
}
func watchForChanges(watcher *fsnotify.Watcher) {
// 监听当前目录下的所有Go文件
err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if filepath.Ext(path) == ".go" {
return watcher.Add(path)
}
return nil
})
if err != nil {
log.Fatal(err)
}
}
func restartApp() {
log.Println("Restarting application...")
cmd := exec.Command("go", "run", ".") // 这里使用了简单的重新运行方式,实际生产中可以替换为编译命令并重启
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
log.Println("Error restarting application:", err)
}
// 在实际生产中,你可能需要等待一段时间,确保新的进程完全启动
time.Sleep(2 * time.Second)
os.Exit(0) // 退出当前进程,让新的进程接管
}