go icon indicating copy to clipboard operation
go copied to clipboard

cmd/go: adjust `PATH` when `go run`/`go generate` runs the built binary

Open hyangah opened this issue 1 year ago • 4 comments

Go version

go version go1.22.0 darwin/amd64

Output of go env in your module/workspace:

$ go env GOTOOLCHAIN
auto
$ GOTOOLCHAIN=local go version
go version go1.21.9 darwin/amd64
$ go version
go version go1.22.0 darwin/amd64

What did you do?

-- go.mod --
module example.com/m

go 1.22.0
-- main.go --
package main

import "os"
import "os/exec"

func main() {
        println(os.Getenv("GOROOT"))
        bin, _ := exec.LookPath("go")
        println(bin)
}

What did you see happen?

$ go run .
/Users/hakim/go/pkg/mod/golang.org/[email protected]
/usr/local/go/bin/go

Since my local version is go1.21.9, but my go.mod requires go1.22.0+, toolchain switch occurs when running go run .. During the toolchain switch the go command sets GOROOT so the switched go command can choose the toolchains correctly.

When go run executes the compiled binary, this GOROOT is left behind. But the PATH is unchanged.

This can be potentially problematic, if the binary invokes go install mod@ver, or runs go build outside the current module.

In my specific case, /usr/local/go/bin/go is go1.21.9, but GOROOT is go1.22.0 root. The go install or go generate program will fail to run due to this mismatched binary/GOROOT pair.

@rsc said 'go test' handles this problem by adjusting PATH, too.

The 'go test' docs explain:

The go command places $GOROOT/bin at the beginning of $PATH in the test's environment, so that tests that execute 'go' commands use the same 'go' as the parent 'go test' command.

We should do the same for go run, go generate, ...

What did you expect to see?

Subprocess can pick matching go binary and GOROOT.

hyangah avatar Jun 14 '24 20:06 hyangah

From a brief investigation looks like 'go generate' already adjusts the path accordingly since CL 404134. I'll push a fix for go run.

mauri870 avatar Jun 18 '24 10:06 mauri870

Change https://go.dev/cl/593255 mentions this issue: cmd/go: place GOROOT/bin at the beginning of PATH in 'go run'

gopherbot avatar Jun 18 '24 11:06 gopherbot

This seems reasonable to me. Thanks for the CL!

matloob avatar Jun 27 '24 19:06 matloob