当升级后不再需要已删除的传递依赖项时,cmd/go: 'go get all' 不再起作用,

vshtjzan  于 3个月前  发布在  Go
关注(0)|答案(5)|浏览(40)

go get -d all 曾在某些情况下无法正常工作。
从 Go 1.16 开始,它首先将 all 解析为一个包模式,然后尝试安装每个这样的包的最新版本。如果其中一些包已被删除,它会失败。
在 Go 1.15 及更早版本中,它的行为更接近于 go get -u -t ./... 今天所做的操作:它升级了(部分子集)直接导入的包,然后从那里升级了传递依赖项。
作为解决方法,go get -d -u -t ./... 实现了基本相同的一组升级,但 go get -d all 应该是一个合理的替代方案。

$ go1.17rc1 get -d all
go get all: module google.golang.org/protobuf@upgrade found (v1.27.1), but does not contain package google.golang.org/protobuf/internal/fieldsort
go get all: module google.golang.org/protobuf@upgrade found (v1.27.1), but does not contain package google.golang.org/protobuf/internal/mapsort

$ go1.16.6 get -d all
go get all: module google.golang.org/protobuf@upgrade found (v1.27.1), but does not contain package google.golang.org/protobuf/internal/fieldsort
go get all: module google.golang.org/protobuf@upgrade found (v1.27.1), but does not contain package google.golang.org/protobuf/internal/mapsort

$ go1.15.14 get -d all
go: github.com/google/go-cmp upgrade => v0.5.6
go: google.golang.org/protobuf upgrade => v1.27.1
go: golang.org/x/xerrors upgrade => v0.0.0-20200804184101-5ec99f83aff1

$ go1.17rc1 get -d -u -t ./...
go get: upgraded google.golang.org/protobuf v1.25.0 => v1.27.1

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

go 1.16

require google.golang.org/protobuf v1.25.0
-- main.go --
package main

import _ "google.golang.org/protobuf/proto"
0md85ypi

0md85ypi1#

CC @jayconrod@matloob

pvabu6sv

pvabu6sv2#

由于没有人针对Go 1.16报告这个问题,而且go get -d -u -t ./...作为解决方法工作正常,我怀疑它还不够严重,不值得进行回溯移植。(话虽如此,如果修复补丁干净地应用于Go 1.16,我认为回溯移植也是可以的。无论如何,Go 1.15都不会受到影响。)

nukf8bse

nukf8bse3#

这个问题标记为1.19版本。它只是在里程碑中不断推进。是否应该将其移动到Backlog?

yb3bgrhw

yb3bgrhw4#

https://go.dev/cl/449035提到了这个问题:all: update all dependencies to @latest

mepcadol

mepcadol5#

请注意,-d 标志不再存在(它是默认的),但这个错误仍然存在:go get all 首先会识别与 all 模式匹配的现有软件包,然后尝试解析它们的传递依赖关系——即使在解析这些依赖关系的过程中,中间步骤最终改变了哪些软件包处于 all 中。
可能 cmd/go/internal/modget 应该特别对待 all 模式,以便在每次迭代时重新解析该模式。

相关问题