我有以下代码可以工作,我需要在链中执行需要在执行其他命令之前完成的命令。
我使用丑陋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
答案 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
陈述