如何使用带有多个参数的 exec.Command 正确“构建”?

Gra*_*esh 0 command-line go

我正在尝试使用 exec.Command 编译 go 包。我成功地使用了“go”和“build”参数,如下所示:

package main

import (
    "fmt"
    "log"
    "os/exec"
)

func main() {
    out, err := exec.Command("go", "build").Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(out)
}
Run Code Online (Sandbox Code Playgroud)

然而,在尝试使用更多参数执行“go build”时,我似乎做错了什么?这就是我的代码的样子:

package main

import (
    "fmt"
    "log"
    "os/exec"
)

func main() {
    out, err := exec.Command("set", "GOOS=js&&", "set", "GOARCH=wasm&&", "go", "build", "-o", "C:/Users/Daniel/Desktop/go-workspace/src/sandbox/other/wasm/assets/json.wasm", "kard").Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(out)
}
Run Code Online (Sandbox Code Playgroud)

输出是exec: "set": executable file not found in %PATH%

我在命令行中为此执行的正常命令是set GOOS=js&& set GOARCH=wasm&& go build -o C:\Users\Daniel\Desktop\go-workspace\src\sandbox\other\wasm\assets\json.wasm kard.

我认为使用 exec.Command 有一些误解?我真的很感谢任何支持。

srp*_*pen 5

应用程序使用 shell 语法来设置环境变量,但 exec 包不使用 shell(除非您运行的命令是 shell)。

使用命令环境指定执行命令的环境变量。

通常go build不会写入 stdout,但它会将错误写入 stderr。使用 CombinedOutput 而不是 Output 可以轻松捕获错误文本。

cmd := exec.Command("go", "build", "-o", "C:/Users/Daniel/Desktop/go-workspace/src/sandbox/other/wasm/assets/json.wasm", "kard")
cmd.Env = []string{"GOOS=js", "GOARCH=wasm"}
out, err := cmd.CombinedOutput()
if err != nil {
    fmt.Printf("%v: %s\n", err, out)
}
Run Code Online (Sandbox Code Playgroud)