用golang exec.Command运行go install

时间:2017-03-21 11:16:55

标签: ubuntu go

我正在尝试为webhook编写一些代码,这将调用go install。我遇到的问题是,当我用exec.Command调用任何go命令时,没有设置GOPATH

func exec_cmd(w http.ResponseWriter, cmd string, args ...string) {
    command := exec.Command(cmd, args...)
    var out bytes.Buffer
    var stderr bytes.Buffer
    command.Stdout = &out
    command.Stderr = &stderr
    err := command.Run()
    if err != nil {
        errstring := fmt.Sprintf(fmt.Sprint(err) + ": " + stderr.String())
        io.WriteString(w, errstring)
    }
    io.WriteString(w, out.String())
    fmt.Println(out.String())
}

func webhook(w http.ResponseWriter, r *http.Request) {
    exec_cmd(w, "go", "install", "github.com/me/myrepo/mything")
}

func test(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "test")
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/webhook", webhook)
    mux.HandleFunc("/", test)
    http.ListenAndServe(":8000", mux)
}

当点击webhook端点时,它会给出:

exit status 1: can't load package: package github.com/me/myrepo/mything: cannot find package "github.com/me/myrepo/mything" in any of:
    /usr/lib/go-1.6/src/github.com/me/myrepo/mything (from $GOROOT)
    ($GOPATH not set)

我如何确保在此上下文中设置GOPATH?

如果我从命令行运行“go install github.com/me/myrepo/mything”,它可以正常工作。

1 个答案:

答案 0 :(得分:2)

您是在编辑器上下文中运行它,还是在容器中运行?它不会在没有GOPATH env变量集的情况下工作。

如果使用go run main.go运行,它是否有效?它在这种情况下对我有用而无需修改代码。只要父上下文可以访问GOPATH就可以了。您也可以使用以下方式手动设置它:

command.Env = append(os.Environ(), "GOPATH=/tmp/go")

或者您可以在此进程将运行的上下文中设置GOPATH(用于安装)和PATH(用于go,git cmds)(可能更可取),例如在systemd单元文件中。