美文网首页
Gin-监听代码变化自动重启Server

Gin-监听代码变化自动重启Server

作者: 霡霂976447044 | 来源:发表于2020-05-01 09:59 被阅读0次

思路是监听.go文件变化,然后重启进程即可。

example.go

package main

import (
    "flag"
    "fmt"
    "log"
    "os"
    "os/exec"
    "path/filepath"
    "strings"
    "time"

    "github.com/fsnotify/fsnotify"
)

func buildServer(target string) string {
    binPath, err1 := exec.LookPath("go")
    if err1 != nil {
        fmt.Println("Cannot find go executable file", err1)
        os.Exit(-2)
    }
    outputName := ""
    if target == "." {
        outputName = "project.bin"
    } else if strings.HasSuffix(target, ".go") {
        outputName = strings.Split(target, ".")[0]
    } else {
        fmt.Println("taget must: '.' or '*.go' ", err1)
        os.Exit(-2)
    }
    // pwd, _ := os.Getwd()
    args := []string{"go", "build", "-o", outputName, target}
    procAttr := &os.ProcAttr{
        Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
    }
    process, err := os.StartProcess(binPath, args, procAttr)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(args, "executing")
    process.Wait()
    fmt.Printf("Build %s success\n", outputName)
    return outputName

}
func createProcess(target string) (*os.Process, string) {
    outputName := buildServer(target)
    binPath, err1 := exec.LookPath("./" + outputName)
    if err1 != nil {
        fmt.Printf("Cannot find %s executable file\n", outputName)
        os.Exit(-3)
    }

    // pwd, _ := os.Getwd()
    args := []string{binPath}
    procAttr := &os.ProcAttr{
        Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
    }
    process, err := os.StartProcess(outputName, args, procAttr)
    if err != nil {
        fmt.Println(err)
        os.Exit(-4)
    }
    return process, outputName
}

func main() {
    target := flag.String("start", ".", "go build && run it")
    flag.Parse()
    process, outputName := createProcess(*target)

    fmt.Printf("Running %s PID: %d\n", outputName, process.Pid)

    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal(err)
    }
    defer watcher.Close()

    done := make(chan bool)
    lastModify := time.Now().Unix()
    go func() {
        for {
            select {
            case event, ok := <-watcher.Events:
                if !ok {
                    return
                }
                log.Println("event:", event)
                if event.Op&fsnotify.Write == fsnotify.Write {
                    if strings.HasSuffix(event.Name, ".go") {
                        if time.Now().Unix()-lastModify > 3 {
                            lastModify = time.Now().Unix()
                            err := process.Kill()
                            if err != nil {
                                fmt.Println(err)
                                os.Exit(-1)
                            } else {
                                fmt.Println("Restarting...")
                                process, outputName = createProcess(*target)
                            }
                        } else {
                            fmt.Println("Update too full, ignored", process.Pid)
                        }

                    }
                }
            case err, ok := <-watcher.Errors:
                if !ok {
                    return
                }
                log.Println("error:", err)
            }
        }
    }()

    e := filepath.Walk("./", func(path string, f os.FileInfo, err error) error {
        if f == nil {
            return err
        }
        if f.IsDir() {
            err = watcher.Add(path)
            log.Printf("Dir:%s add to watch", path)
            if err != nil {
                log.Fatal(err)
            }
        }
        return nil
    })
    if e != nil {
        fmt.Printf("filepath.Walk() returned %v\n", err)
    }

    <-done
}

运行

go run example.go -start gin.go

相关文章

  • Gin-监听代码变化自动重启Server

    思路是监听.go文件变化,然后重启进程即可。 example.go 运行

  • node学习一

    认识nodemon 监听代码文件的变动,当代码改变之后,自动重启。 安装 npm install -g node...

  • nodemon/server.js 简单使用

    nodemon,是一个监听node代码变化的工具,会自动完成node服务器和数据库服务器的重启 安装 使用npm安...

  • node笔记3——express框架

    1. 使用 nodemon 工具来自动重启web服务器 nodemon的作用:能够实时监听当前项目中,文件的变化;...

  • 2020-09-17 node基础

    运行、调试、模块 bash 运行 Nodemon自动重启见识代码修改,自动重启

  • 配置nodemon,监听文件变化,自动重启服务

    1、安装 nodemon:npm install nodemon -D -S 即 --save(保存) -D 即 ...

  • 实现一个简单的服务自动重启

    今天跟大家分享一个好用的技能 -- 监听文件变化,自动重启服务 很多时候我们都会用到 webpack 中带的热更新...

  • (二)构建本地服务器

    webpack-dev-server 如果想让你的浏览器监听你的代码的修改,并自动刷新显示修改后的结果,那你就需要...

  • KVO学习

    部分代码均可参考AFNetworking文件 1.KVO监听属性(自动监听) 1.1.注册监听 1.2.监听回调 ...

  • Express mongodb

    安装express 监听路由和响应内容,使用nodemon自动重启 执行 nodemon file.js 安装 ...

网友评论

      本文标题:Gin-监听代码变化自动重启Server

      本文链接:https://www.haomeiwen.com/subject/fmdtghtx.html