具有等待功能的链接命令

时间:2018-02-15 14:52:32

标签: go

我有以下代码可以工作,我需要在链中执行需要在执行其他命令之前完成的命令。 我使用丑陋ifElse的wait命令来执行此操作,如果我需要链接更多命令它变得更加丑陋......是否有更好的方法来编写它?

    cmd, buf := exec.CommandContext("npm", dir+"/"+path, "install")

    //Wait 
    if err := cmd.Wait(); err != nil {
        log.Printf("executing npm install returned error: %v", err)
    } else {
        log.Println(buf.String())
        gulpCmd, gulpBuf := exec.CommandContext(“gulp”, pdir+"/"+n.path)
   //Wait 
        if err := gulpCmd.Wait(); err != nil {
            log.Printf("error: %v", err)
        } else {
            log.Println(gulpBuf.String())
            pruneCmd, pruneBuf := exec.CommandContext("npm", pdir+"/"+n.path, "prune", "--production")
     //Wait 
            if err := pruneCmd.Wait(); err != nil {
                log.Printf("error: %v", err)
            } else {
                log.Println(pruneBuf.String())
            }

        }

更新

如果我尝试运行这个简单的程序就行了,我得到了消息

added 563 packages in 19.218s*

这是代码

cmd := exec.Command("npm", "install")
cmd.Dir = filepath.Join(pdir, n.path)
cmdOutput := &bytes.Buffer{}
cmd.Stdout = cmdOutput
err := cmd.Run()
if err != nil {
    os.Stderr.WriteString(err.Error())
}
fmt.Print(string(cmdOutput.Bytes()))

但是,如果我尝试跟随,我得到错误,它无法执行第一个命令,这是npm安装,任何想法?

cmdParams := [][]string{
    {"npm", filepath.Join(dir,path), "install"},
    {"gulp", filepath.Join(pdir,n.path)},
    {"npm", filepath.Join(pdir, n.path), "prune", "--production"},
}

for _, cmdParam := range cmdParams {
    out, err := exec.Command(cmdParam[0], cmdParam[1:]...).Output()
    if err != nil {
        log.Printf("error running %s: %v\n", cmdParam[0], err)
        return
    }
    log.Println(string(out))
}

我得到的错误是错误运行npm:退出状态1

更新2

命令是并且应该一个接一个地运行,当第一个完成然后运行gulp等时,我还需要提供命令的输出

1. npm install
2. gulp
3. npm prune 

2 个答案:

答案 0 :(得分:2)

在切片中列出命令,并使用简单循环按顺序执行所有命令。并使用filepath.Join()构建文件夹。

此外,我不确定您使用os/exec运行命令所使用的软件包,我们可以进一步简化循环体中命令的执行。例如Command.Output()运行命令并返回其标准输出:

cmdParams := [][]string{
    {filepath.Join(dir,path), "npm", "install"},
    {filepath.Join(pdir,n.path), "gulp"},
    {filepath.Join(pdir, n.path), "npm", "prune", "--production"},
}

for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]
    // Wait to finish, get output:
    out, err := cmd.Output()
    if err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Println("Finished %s, output: %s", cp[1:], out)
}

答案 1 :(得分:0)

为了避免丑陋if-else,您可以编写如下代码:

err := someFunction1()
if err != nil {
  return err
}

err := someFunction2()
if err != nil {
  return err
}

err := someFunction3()
if err != nil {
  return err
}

但你会有丑陋的(恕我直言)乘法return陈述