Gulp 如何从Go运行CLI命令?

cczfrluj  于 2022-12-08  发布在  Gulp
关注(0)|答案(4)|浏览(211)

如何从Go程序运行Gulp任务?
下面是我从典型终端运行的命令:

gulp serv.dev

我如何运行golang的这一行简单代码:

package main

import (
    "net/http"
    "github.com/julienschmidt/httprouter"
    "fmt"
)

func main() {
    // What do I put here to open terminal in background and run `gulp serv.dev`?
}
rks48beu

rks48beu1#

你要找的是执行指挥官
您很可能希望生成一个运行gulp任务的进程。
可以这样做:

package main

import (
    "os/exec"
)

func main() {
    cmd := exec.Command("gulp", "serv.dev")
    if err := cmd.Run(); err != nil {
        log.Fatal(err)
    }
}
fzsnzjdm

fzsnzjdm2#

看看exec。对于您的用例:

package main
import (
    "net/http"
    "github.com/julienschmidt/httprouter"
    "fmt"
    "os/exec"
    "log"
)

func main() {
    out, err := exec.Command("gulp", "serv.dev").Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("The date is %s\n", out)
}
eqqqjvef

eqqqjvef3#

您最有可能需要的是exec package

cmd := exec.Command("gulp", "serv.dev")
err := cmd.Run()

看一看exec.Command中的示例。他们解释了如何传递参数和读取输出。

46qrfjad

46qrfjad4#

更通用,输出更好。
使用exec.Commandbuffers记录输出,并仅在有用时显示。
你甚至可以通过使用变量参数,也就是任意数量元素的参数,使函数与任何命令一起工作。
适当地标记非手动错误,以便如果命令失败,您会被告知是哪一个错误以及原因。
最后要注意的是,Go语言虽然表现力很强,但它是一门相当原始的语言。它毫无用处地牵着你的手。你将不得不自己编写大量的程序。
示例代码

package main

import (
    "bytes"
    "fmt"
    "os"
    "os/exec"
    "runtime"
    "strings"
)

func main() {
    runCommand(currentFunction(), "ping", "-c1", "google.commm")
}

func commandErrorMessage(stderr bytes.Buffer, program string) string {
    message := string(stderr.Bytes())

    if len(message) == 0 {
        message = "the command doesn't exist: " + program + "\n"
    }

    return message
}

func currentFunction() string {
    counter, _, _, success := runtime.Caller(1)

    if !success {
        println("functionName: runtime.Caller: failed")
        os.Exit(1)
    }

    return runtime.FuncForPC(counter).Name()
}

func printCommandError(stderr bytes.Buffer, callerFunc string, program string, args ...string) {
    printCommandErrorUbication(callerFunc, program, args...)
    fmt.Fprintf(os.Stderr, "%s", commandErrorMessage(stderr, program))
}

func printCommandErrorUbication(callerFunc string, program string, args ...string) {
    format := "error at: %s: %s %s\n"
    argsJoined := strings.Join(args, " ")
    fmt.Fprintf(os.Stderr, format, callerFunc, program, argsJoined)
}

func runCommand(callerFunc string, program string, args ...string) {
    command := exec.Command(program, args...)
    var stderr bytes.Buffer
    command.Stderr = &stderr
    fail := command.Run()

    if fail != nil {
        printCommandError(stderr, callerFunc, program, args...)
        os.Exit(1)
    }
}

示例运行

$ go run test.go
error at: main.main: ping -c1 google.commm
ping: google.commm: Name or service not known
exit status 1

相关问题