github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmg/SubCommand/Make.go (about) 1 package SubCommand 2 3 import ( 4 "os" 5 "path/filepath" 6 "strings" 7 "time" 8 9 "errors" 10 "fmt" 11 "github.com/bronze1man/kmg/kmgCmd" 12 "github.com/bronze1man/kmg/kmgConfig" 13 "github.com/bronze1man/kmg/kmgConsole" 14 "github.com/bronze1man/kmg/kmgFile" 15 "github.com/bronze1man/kmg/kmgPlatform" 16 "github.com/bronze1man/kmg/kmgTime" 17 ) 18 19 func makeCmd() { 20 kmgc, err := kmgConfig.LoadEnvFromWd() 21 kmgConsole.ExitOnErr(err) 22 if kmgc.Make == "" { 23 kmgConsole.ExitOnStderr(errors.New("Please defined a Make command in .kmg.yml file to use kmg make")) 24 return 25 } 26 if len(os.Args) >= 2 && kmgc.MakeSubCommandMap != nil { 27 for cmdName, cmdString := range kmgc.MakeSubCommandMap { 28 if strings.EqualFold(cmdName, os.Args[1]) { 29 args := strings.Split(cmdString, " ") 30 os.Args = os.Args[1:] 31 runCommand(kmgc, args) 32 return 33 } 34 } 35 } 36 args := strings.Split(kmgc.Make, " ") 37 runCommand(kmgc, args) 38 } 39 40 func runCommand(kmgc *kmgConfig.Env, args []string) { 41 os.Chdir(kmgc.ProjectPath) 42 logDir := filepath.Join(kmgc.LogPath, "run") 43 kmgFile.MustMkdirAll(logDir) 44 thisLogFilePath := filepath.Join(logDir, time.Now().Format(kmgTime.FormatFileName)+".log") 45 kmgFile.MustWriteFile(thisLogFilePath, []byte{}) 46 if !kmgPlatform.GetCompiledPlatform().Compatible(kmgPlatform.WindowsAmd64) { 47 lastLogPath := filepath.Join(logDir, "last.log") 48 if kmgFile.MustFileExist(lastLogPath) { 49 kmgFile.MustSymlink(kmgFile.MustReadSymbolLink(lastLogPath), filepath.Join(logDir, "last2.log")) 50 } 51 kmgFile.MustSymlink(filepath.Base(thisLogFilePath), lastLogPath) 52 } 53 //TODO 大部分命令是 kmg gorun xxx 在这个地方可以直接调用gorun解决问题,这样可以少开一个进程加快了一些速度 54 // 问题: 上述做法不靠谱,会导致last.log没有用处. 55 //if len(args) >= 2 && args[0] == "kmg" && strings.EqualFold(args[1], "gorun") { 56 // os.Args = append(args[1:], os.Args[1:]...) 57 // goCmd.GoRunCmd() 58 // return 59 //} 60 // 下面的做法不靠谱,会让signle无法传递 61 //err := kmgCmd.CmdSlice(append(args, os.Args[1:]...)). 62 // SetDir(kmgc.ProjectPath). 63 // RunAndTeeOutputToFile(thisLogFilePath) 64 // TODO bash转义 65 bashCmd := strings.Join(append(args, os.Args[1:]...), " ") 66 bashCmdStr := bashCmd + " 2>&1 | tee -i " + thisLogFilePath + " ; test ${PIPESTATUS[0]} -eq 0" 67 if kmgPlatform.IsWindows() { 68 err := kmgCmd.CmdString(bashCmdStr).SetDir(kmgc.ProjectPath).StdioRun() 69 if err != nil { 70 err = fmt.Errorf("kmg make: %s", err) 71 kmgConsole.ExitOnErr(err) 72 } 73 return 74 } else { 75 err := kmgCmd.CmdBash(bashCmdStr).SetDir(kmgc.ProjectPath).StdioRun() 76 if err != nil { 77 err = fmt.Errorf("kmg make: %s", err) 78 kmgConsole.ExitOnErr(err) 79 } 80 return 81 } 82 }