【问题标题】:running go install with golang exec.Command使用 golang exec.Command 运行 go install
【发布时间】:2017-03-21 11:16:55
【问题描述】:

我正在尝试为 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”,它工作正常。

【问题讨论】:

  • golang.org/pkg/os/exec/#Cmd中填写Env
  • 你也应该更新你的 Go 版本,如果只是因为 go1.8 引入了一个默认的 GOPATH。

标签: ubuntu go


【解决方案1】:

您是在编辑器上下文中运行它,还是在容器中运行它?如果没有设置 GOPATH 环境变量,它将无法在上下文中工作。

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

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

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

【讨论】:

  • 设置 Env 现在可以正常工作了,谢谢。将它设置在 systemd 进程文件中可能会更好,但我没有意识到我可以这样做。
猜你喜欢
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多