我正在尝试使用 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 有一些误解?我真的很感谢任何支持。
应用程序使用 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)