简单说明
错误but go 1.16 would select 意味着现在您的编译软件(编译后的二进制文件)在使用 Go 1.16(或更低版本)而不是 Go 1.17(或更高版本)编译后的行为方式存在更深层次的问题。
是什么导致了这个问题?:这可能完全超出您的控制范围,例如,您的一个依赖项的无害更改可能会将其作为副作用引入。 (正如最近看到的 golang.org/x/oauth2 和类似的,它已经破坏了世界各地的许多构建。)
我可以简单地避免运行go mod tidy吗?可以,但这对您的实际问题没有任何帮助。
那么对我有什么实际影响?到目前为止,您在 Go 1.16 和 1.17 之间没有构建可重复性。如果您使用 Go 1.16 构建或测试,您的程序的行为可能与 Go 1.17+ 的行为略有不同。程序的编译采用不同版本的依赖项。非常轻微的不同,但是不同。细节超出范围。
全部迁移到 Go 1.17(或更高版本)
-
记录/传达任何人都不应该使用 Go 1.16 或更低版本编译您的代码。
-
确保您的持续集成未使用 Go 1.16 或更低版本。
-
在所有脚本、Makefile、管道等中,将命令 go mod tidy 更改为:
go mod tidy -compat=1.17
继续使用 Go 1.16(或更低版本)
go mod tidy -go=1.16
它声明你想在 1.16 冻结 go mod 行为。即使您使用 Go 1.17(或 1.18 等)构建,它也不会使用新的依赖修剪算法。您将获得一些 1.17+ 的新功能,但不是全部。
(虽然go mod edit -go=1.16 有时在这里可能就足够了,但您通常需要tidy 以便使用新下载的版本/哈希更新go.sum。)
额外症状
在某些极端情况下,我看到ambiguous import 似乎只是针对非常相似的情况的不同措辞:
example.com/foo/bar tested by
example.com/foo/bar.test imports
google.golang.org/grpc/credentials/oauth imports
golang.org/x/oauth2/google imports
cloud.google.com/go/compute/metadata: ambiguous import: found package cloud.google.com/go/compute/metadata in multiple modules:
cloud.google.com/go v0.99.0 (/go/pkg/mod/cloud.google.com/go@v0.99.0/compute/metadata)
cloud.google.com/go/compute v1.7.0 (/go/pkg/mod/cloud.google.com/go/compute@v1.7.0/metadata)
此答案也适用于此类错误。
等等,迁移什么?我从未真正使用过 Go 1.16?
您可能认为在 go.mod 中声明版本 go 1.17 会强制使用该 Go 版本或更高版本。在这种情况下,即使是某些 Go 1.16 工具也会因go.mod file indicates go 1.17, but maximum supported version is 1.16 而失败,从而强制执行这种直觉。有道理,对吧?没有。
残酷的现实是,只要您稍微调整一下构建过程,就可以使用 Go 1.16 或 Go 1.15编译这种类型的一些代码库(可能也是您的代码库)!核心团队不想默默地为这种人为的构建过程引入问题。这就是为什么您面临明确保留或明确放弃这种向后兼容性的决定的原因。