123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- package utils
- import (
- "fmt"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
- "sync"
- )
- type RunTask interface {
- AddTask()
- RunTask()
- }
- type T struct {
- sync.Mutex
-
- ch chan struct{}
- closeChan chan struct{}
-
- p *os.Process
-
- f func(chan struct{}) error
- }
- func NewT() *T {
- return newT(nil)
- }
- func newT(f func(chan struct{}) error) *T {
- t := &T{
- Mutex: sync.Mutex{},
- ch: make(chan struct{}, 1),
- closeChan: make(chan struct{}),
- f: f,
- }
- if f == nil {
- t.f = t.DefaultF
- }
- return t
- }
- func (t *T) AddTask() {
- t.Lock()
- defer t.Unlock()
- if len(t.ch) == 1 {
-
-
- return
- }
- t.ch <- struct{}{}
- }
- func (t *T) RunTask() {
- fmt.Println("进入")
-
- ch := make(chan struct{})
-
- go t.f(ch)
- for {
- _, ok := <-t.ch
- ch <- struct{}{}
- if !ok {
- return
- }
-
- <-t.closeChan
- go t.f(ch)
- }
- }
- func (t *T) DefaultF(ch chan struct{}) error {
- var buildCmd *exec.Cmd
- var cmd *exec.Cmd
-
- _, err := os.Stat(filepath.Join("Makefile"))
- if runtime.GOOS != "windows" && err != nil {
- _, err := exec.LookPath("make")
- if err == nil {
- cmd = exec.Command("makefile")
- goto makefile
- }
- }
-
- _, err = exec.LookPath("go")
- if err != nil {
- return err
- }
-
- switch runtime.GOOS {
- case "windows":
- buildCmd = exec.Command("go", "build", "-o", "gva.exe", "main.go")
- default:
- buildCmd = exec.Command("go", "build", "-o", "gva", "main.go")
- }
- err = buildCmd.Run()
- fmt.Println("build 执行完成")
- if err != nil {
- return err
- }
-
- switch runtime.GOOS {
- case "windows":
- cmd = exec.Command("gva.exe")
- default:
- cmd = exec.Command("./gva")
- }
- makefile:
-
- err = cmd.Start()
- if err != nil {
- return err
- }
- t.p = cmd.Process
- fmt.Println("pid", t.p.Pid)
- go func() {
- err = cmd.Wait()
- }()
- <-ch
-
- err = cmd.Process.Kill()
- fmt.Println("kill err", err)
-
- t.closeChan <- struct{}{}
- return err
- }
|