`cmd/go: GOTOOLCHAIN=version+auto` 不会在 `go install` 中使用指定的版本,

bq9c1y66  于 22天前  发布在  Go
关注(0)|答案(2)|浏览(14)

Go版本

go1.21.13 linux/amd64

在你的模块/工作区中的go env的输出:

GO111MODULE=''
GOARCH='amd64'
GOBIN='/home/caleb/bin'
GOCACHE='/home/caleb/.cache/go-build'
GOENV='/home/caleb/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMODCACHE='/home/caleb/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/caleb/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/home/caleb/apps/oldgo/go1.21.13'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/home/caleb/apps/oldgo/go1.21.13/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.21.13'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOMOD='/dev/null'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build2590561090=/tmp/go-build -gno-record-gcc-switches'

你做了什么?

我相信在较新的Go版本中也可以复现这个问题,但由于这个bug是关于升级Go工具链版本的,所以用一个较旧的版本更容易演示。
当我使用1.21.13版本的go命令时会发生以下情况:

$ GOTOOLCHAIN=local go version
go version go1.21.13 linux/amd64
$ mkdir -p /tmp/x && GOBIN=/tmp/x GOTOOLCHAIN=go1.23.0+auto go install honnef.co/go/tools/cmd/staticcheck@2024.1.1 && go version /tmp/x/staticcheck
go: honnef.co/go/tools@v0.5.1 requires go >= 1.22.1; switching to go1.22.6
/tmp/x/staticcheck: go1.22.6

当我使用1.23.0版本的go命令时会发生以下情况:

$ GOTOOLCHAIN=local go version
go version go1.23.0 linux/amd64
$ mkdir -p /tmp/x && GOBIN=/tmp/x GOTOOLCHAIN=go1.23.0+auto go install honnef.co/go/tools/cmd/staticcheck@2024.1.1 && go version /tmp/x/staticcheck
/tmp/x/staticcheck: go1.23.0

你看发生了什么?

在使用GOTOOLCHAIN=go1.23.0+auto时,Go 1.21.13使用Go 1.22.6构建了二进制文件。

你期望看到什么?

我希望两个调用都能使用Go 1.23.0构建静态检查。
honnef.co/go/tools/cmd/staticcheck@2024.1.1在其go.mod中有go 1.22.1。因此,如果我运行GOTOOLCHAIN=auto go install honnef.co/go/tools/cmd/staticcheck@2024.1.1,它将使用Go 1.22.6,因为这是前一个Go版本的最新补丁发布,也是https://go.dev/doc/toolchain#switch文档中列出的三个选项的最低版本。
然而,正如https://go.dev/doc/toolchain#intro文档中所描述的,GOTOOLCHAIN变量的形式实际上告诉Go工具使用<name>和任何Go版本auto都会使用的版本的最大值:
+auto设置在决定是否进一步切换之前要使用的默认工具链。例如,GOTOOLCHAIN=go1.21.3+auto会指示go命令从默认使用Go 1.21.3开始,但仍然会在go和toolchain行指示的情况下使用更新的工具链。
就我所知,go install完全忽略了<name>+auto中的GOTOOLCHAIN=auto部分,而只是像我使用了x1m14n1x一样表现。

相关问题