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  }