From 2bca2e3151baf25b92455764f3d9970e69be3e07 Mon Sep 17 00:00:00 2001 From: songzhibin97 <718428482@qq.com> Date: Mon, 16 Nov 2020 20:55:47 +0800 Subject: [PATCH] =?UTF-8?q?=E7=83=AD=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改bug 优化增加回显 --- server/utils/cmd_Task.go | 44 +++++++++++++++++++++--------- server/utils/cmd_monitor.go | 53 ++++++++++++++++++++++--------------- 2 files changed, 63 insertions(+), 34 deletions(-) diff --git a/server/utils/cmd_Task.go b/server/utils/cmd_Task.go index 2eded600..a040179a 100644 --- a/server/utils/cmd_Task.go +++ b/server/utils/cmd_Task.go @@ -1,7 +1,9 @@ package utils import ( + "bytes" "fmt" + "io" "os" "os/exec" "path/filepath" @@ -85,7 +87,7 @@ func (t *T) DefaultF(ch chan struct{}) error { // 判断是否有makefile _, err := os.Stat(filepath.Join("Makefile")) - if runtime.GOOS != "windows" && err != nil { + if runtime.GOOS != "windows" && err == nil { _, err := exec.LookPath("make") if err == nil { cmd = exec.Command("makefile") @@ -105,12 +107,12 @@ func (t *T) DefaultF(ch chan struct{}) error { default: buildCmd = exec.Command("go", "build", "-o", "gva", "main.go") } - err = buildCmd.Run() - fmt.Println("build 执行完成") if err != nil { return err } + fmt.Println("build 执行完成") + // 执行 switch runtime.GOOS { @@ -121,15 +123,7 @@ func (t *T) DefaultF(ch chan struct{}) error { } makefile: // 开始执行任务 - err = cmd.Start() - if err != nil { - return err - } - t.p = cmd.Process - fmt.Println("pid", t.p.Pid) - go func() { - err = cmd.Wait() - }() + t.echo(cmd) <-ch // 回收资源 err = cmd.Process.Kill() @@ -138,3 +132,29 @@ makefile: t.closeChan <- struct{}{} return err } + +// echo: 封装回显 +func (t *T) echo(cmd *exec.Cmd) error { + var stdoutBuf bytes.Buffer + stdoutIn, _ := cmd.StdoutPipe() + var errStdout, errStderr error + stdout := io.MultiWriter(os.Stdout, &stdoutBuf) + err := cmd.Start() + if err != nil { + return err + } + go func() { + _, errStdout = io.Copy(stdout, stdoutIn) + }() + t.p = cmd.Process + fmt.Println("pid", t.p.Pid) + go func() { + _ = cmd.Wait() + if errStdout != nil || errStderr != nil { + fmt.Printf("failed to capture stdout or stderr\n") + } + outStr := string(stdoutBuf.Bytes()) + fmt.Printf("\nout:\n%s\n", outStr) + }() + return nil +} diff --git a/server/utils/cmd_monitor.go b/server/utils/cmd_monitor.go index 187be57e..cc1f58ec 100644 --- a/server/utils/cmd_monitor.go +++ b/server/utils/cmd_monitor.go @@ -55,33 +55,24 @@ func (w *Watch) Watch(path string, t *T) error { c <- errors.New("errors close") return } - // 判断时间 - fmt.Println("even", even) + // 判断事件 switch { - // todo 待处理 case even.Op&fsnotify.Create == fsnotify.Create: //这里获取新创建文件的信息,如果是目录,则加入监控中 fmt.Println("创建文件 : ", even.Name) //t.AddTask() _ = w.Add(even.Name) + w.addTask(t, even.Name) case even.Op&fsnotify.Write == fsnotify.Write: - fmt.Println("修改 : ", even.Name) - fmt.Println(filepath.Ext(even.Name)) - if filepath.Ext(even.Name) == ".go" { - fmt.Println("send addtask:", even.Name) - t.AddTask() - } - case even.Op&fsnotify.Remove == fsnotify.Remove: - fmt.Println("删除 : ", even.Name) - //t.AddTask() - _ = w.Remove(even.Name) - case even.Op&fsnotify.Rename == fsnotify.Rename: - fmt.Println("重命名 : ", even.Name) - //t.AddTask() + fmt.Println("修改文件 : ", even.Name) + w.addTask(t, even.Name) + case even.Op&fsnotify.Remove == fsnotify.Remove || even.Op&fsnotify.Rename == fsnotify.Rename: + fmt.Println("删除或重命名文件 : ", even.Name) _ = w.Remove(even.Name) + w.addTask(t, even.Name) } case err = <-w.Errors: - fmt.Println("79", err) + fmt.Println("even Error:", err) c <- err return } @@ -106,10 +97,12 @@ func (w *Watch) watchDir(path string) error { for _, f := range fileSlice { fPath := filepath.Join(path, f.Name()) if !f.IsDir() { - // todo 这里加一些条件筛选添加监控的内容 - err = w.watchFile(fPath) - if err != nil { - return err + // 判断是否可监控的文件 + if chickPower(fPath) { + err = w.watchFile(fPath) + if err != nil { + return err + } } } else { err := w.watchDir(fPath) @@ -123,5 +116,21 @@ func (w *Watch) watchDir(path string) error { // watchDir: 处理监控单文件 func (w *Watch) watchFile(path string) error { - return w.Add(path) + var err error + if chickPower(path) { + err = w.Add(path) + } + return err +} + +// chickPower: 判断是否在可控范围内 +func chickPower(name string) bool { + return filepath.Ext(name) == ".go" || filepath.Ext(name) == ".yaml" +} + +// addTask: 偏函数 简化发送任务 +func (w *Watch) addTask(t *T, name string) { + if chickPower(name) { + t.AddTask() + } }