cmd/go: internal error in go work sync

egmofgnx  于 6个月前  发布在  Go
关注(0)|答案(9)|浏览(54)

Go版本
go版本 go1.21.5 darwin/arm64

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

GO111MODULE=''
GOARCH='arm64'
GOBIN=''
GOCACHE='/Users/trajan0x/Library/Caches/go-build'
GOENV='/Users/trajan0x/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/trajan0x/go/pkg/mod'
GONOPROXY='github.com/synapsecns/*'
GONOSUMDB='github.com/synapsecns/*'
GOOS='darwin'
GOPATH='/Users/trajan0x/go'
GOPRIVATE='github.com/synapsecns/*'
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/opt/homebrew/Cellar/go/1.21.5/libexec'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/opt/homebrew/Cellar/go/1.21.5/libexec/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.21.5'
GCCGO='gccgo'
AR='ar'
CC='cc'
CXX='c++'
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 -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/12/8xtw48x951g0vv4z_ctcr2hr0000gn/T/go-build1424252971=/tmp/go-build -gno-record-gcc-switches -fno-common'

你做了什么?

  1. git clone https://github.com/synapsecns/sanguine
  2. go work sync
  3. git checkout 995354fca4e89c0931ea5f6f0a77f170aac2f13e (这种情况在几个提交之间发生,我在Add native ETH support to relayer synapsecns/sanguine#1840上找到了它,只是为了可重复性而在主分支上提供了一个单独的提交)
    (注意:这个recipe对于这种bug不起作用,但我创建了一个仓库here的REPL,并运行了命令,只是为了方便调试。

你看到了什么发生?

go: cloud.google.com/go@v0.110.7 requires
        github.com/google/s2a-go@v0.1.4
panic: internal error: found a version conflict, but no constraint it violates

goroutine 1 [running]:
cmd/go/internal/modload.editRequirements({0x1010edbd0, 0x1014830a0}, 0x14013bbaaa0, {0x0, 0x0, 0x1400bb7e828?}, {0x14007bac000, 0x108, 0x1400bb7e800?})
        /opt/homebrew/Cellar/go/1.21.5/libexec/src/cmd/go/internal/modload/edit.go:336 +0x2bc0
cmd/go/internal/modload.EditBuildList({0x1010edbd0, 0x1014830a0}, {0x0, 0x0, 0x0}, {0x14007bac000, 0x108, 0x200})
        /opt/homebrew/Cellar/go/1.21.5/libexec/src/cmd/go/internal/modload/buildlist.go:640 +0x64
cmd/go/internal/workcmd.runSync({0x1010edbd0, 0x1014830a0}, 0x140000265b8?, {0x14?, 0x1010248c0?, 0x100adbc6c?})
        /opt/homebrew/Cellar/go/1.21.5/libexec/src/cmd/go/internal/workcmd/sync.go:117 +0x4d0
main.invoke(0x10143fd80, {0x140000201a0, 0x1, 0x1})
        /opt/homebrew/Cellar/go/1.21.5/libexec/src/cmd/go/main.go:268 +0x4f0
main.main()
        /opt/homebrew/Cellar/go/1.21.5/libexec/src/cmd/go/main.go:186 +0x754

你期望看到什么?

成功,另一个错误,但不是恐慌。
这个没有被优雅地处理的事实告诉我,这可能是意外的行为。但我有点不确定,因为在edit.go的情况下

1wnzp6jl

1wnzp6jl1#

一些注意事项:

  1. 这似乎在 synapsecns/sanguine@995354f 中可以完美地重现。
  2. github.com/google/s2a-go@v0.1.4 位于 go 1.16 ,因此未被修剪。它直接被工作区中的几个模块所需要。
    当一个被修剪的模块对另一个根模块有需求,而那个根模块未被修剪时,我们需要从模块图的修剪侧过渡到未被修剪的侧。我怀疑在 dqTracker.path 中,当需要这样做时,它并没有发生。
yhqotfr8

yhqotfr82#

https://go.dev/cl/571800提到了这个问题:cmd/go/internal/modload: follow dependencies of unpruned roots in dqTracker.path

rekjcdws

rekjcdws3#

翻译结果为:错误发生在$x^{contrib/terraform-provider-helmproxy}$模块中,冲突产生是因为所选工作区的$x^{github.com/google/pprof}$版本比模块选择的版本要低——但$x^{github.com/google/pprof}$与此模块无关。

$x^{

sanguine/contrib/terraform-provider-helmproxy$ go list -m github.com/google/pprof
github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a

sanguine/contrib/terraform-provider-helmproxy$ GOWORK=off go list -m github.com/google/pprof
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1

}$

o7jaxewo

o7jaxewo4#

依赖于不匹配的 pprof 通过一个旧的 k8s.io/client-go@v0.25.5 传递:

k8s.io/client-go@v0.25.5 cloud.google.com/go@v0.97.0
cloud.google.com/go@v0.97.0 github.com/googleapis/gax-go/v2@v2.1.0
github.com/googleapis/gax-go/v2@v2.1.0 google.golang.org/api@v0.54.0
google.golang.org/api@v0.54.0 cloud.google.com/go@v0.90.0
cloud.google.com/go@v0.90.0 github.com/google/pprof@v0.0.0-20210720184732-4bb14d4b1be1

但是 k8s.io/api v0.25.5go 1.19 上,所以它通常启用了模块图修剪功能——它一定通过其他依赖项被拉入。

mxg2im7a

mxg2im7a5#

好的,这是实际的错误路径:github.com/hashicorp/terraform-provider-google/v4 v4.2.0 被明确要求且未被修剪(在 go 1.16 处)。
从那里,我们到达了未被修剪的错误路径 pprof :

github.com/hashicorp/terraform-provider-google/v4@v4.2.0 google.golang.org/api@v0.60.0
google.golang.org/api@v0.60.0 cloud.google.com/go@v0.97.0
cloud.google.com/go@v0.97.0 github.com/googleapis/gax-go/v2@v2.1.0
github.com/googleapis/gax-go/v2@v2.1.0 google.golang.org/api@v0.54.0
google.golang.org/api@v0.54.0 cloud.google.com/go@v0.90.0
cloud.google.com/go@v0.90.0 github.com/google/pprof@v0.0.0-20210720184732-4bb14d4b1be1

因此,似乎在工作区模式下,我们无法加载 github.com/hashicorp/terraform-provider-google/v4@v4.2.0 的传递依赖关系。

bfnvny8b

bfnvny8b6#

contrib/tfcore/go.mod 正在使用通配符 replace 指令将 google.golang.org/api 替换为该模块特定版本的源代码:

google.golang.org/api => google.golang.org/api v0.86.0
qyswt5oh

qyswt5oh7#

因此,版本中的偏差似乎来自于在 go work sync 中不一致地应用了 replace 指令。

此外,从 EditBuildList 返回的错误导致 go work sync 静默地执行 continue 而不是报错:https://cs.opensource.google/go/go/+/master:src/cmd/go/internal/workcmd/sync.go;l=117-120;drc=ce8146ed3361f584ba79427ac6c6d6fe9c297bea

l5tcr1uw

l5tcr1uw8#

总结:

  • editRequirements 在诊断无法解决的冲突时应用模块图剪枝时存在一个错误,应由 https://go.dev/cl/571800 修复。
  • go work sync 在应用 replace 指令时存在另一个错误,需要单独修复。

这两个错误的组合产生了观察到的症状。

gopyfrb3

gopyfrb39#

我们未能在1.23版本中及时完成此项工作,并且第一个问题评论中的原始错误不再显示,因此我们将将其推送到1.24版本。

相关问题