`cmd/go: 'mod tidy' 有时会添加新的、不必要的 require 部分,

y53ybaqx  于 2个月前  发布在  Go
关注(0)|答案(3)|浏览(113)

Go版本
go版本 go1.22.3 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/p/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/caleb/p/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/home/caleb/apps/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/home/caleb/apps/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.22.3'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOMOD='/home/caleb/3p/pomerium/go.mod'
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-build4079397003=/tmp/go-build -gno-record-gcc-switches'

你做了什么?

这是从#56471衍生出来的。那个提案建议让go mod tidy自动加入多个require部分。然而,有一个基本的bug,即go mod tidy本身往往要对这些多个部分负责。这个问题是关于这个bug的。
在工作中的一个大型私有Go模块中,我们有三个require部分。这些都是由go mod tidy创建的。第一个部分有直接依赖关系,而第二个和第三个require部分有间接依赖关系。
我们可以很容易地重现错误:如果我们删除第二个require部分(这两个间接部分中的第一个),然后运行go mod tidy,它会重新创建单独的间接require部分,而不是将缺失的条目添加到现有的require部分中。
我不能分享工作代码,但是通过查看与#56471相关的问题,我在一个公共仓库中找到了同样发生问题的案例。以下是如何使用该仓库重现问题的示例:

$ git clone https://github.com/pomerium/pomerium
...
$ cd pomerium
$ git checkout -q f54b1a7d098fac76c7ddbccdb9351483466b7b6a
# Observe that the go.mod contains three sections.
# Delete the second section.
$ sed -i '78,123d' go.mod
# Now go.mod contains two sections, direct and indirect.
$ go mod tidy
...
# Observe that go.mod contains three sections again.
# 'go mod tidy' added a section.

你看了什么发生?

go mod tidy 添加了一个新的额外间接 require 部分。

你期望看到什么?

我期望 go mod tidy 能够向现有的 require 部分添加条目。
更一般地说:如果我只编辑go.mod自动进行编辑,从未手动编辑过,我期望Go工具能够维护最多两个 require 部分(一个直接和一个间接)。
请注意,解决这个问题是有可能的。如果你手动将这两个 require 部分连接起来, go mod tidy 将把它们保持在一起作为一个大的部分(它不会把它们分开)。但这种手动工作不应该被要求。此外,这只是暂时的:将来对代码的添加可能会导致 go mod tidygo.mod 添加新部分。

相关问题