go mod 整理错误信息:"but go 1.16 would select"

go mod tidy error message: "but go 1.16 would select"

当我运行go mod tidy几个包显示错误

> go mod tidy

github.com/myrepo/myproj imports
    go.k6.io/k6 imports
    go.k6.io/k6/cmd imports
    github.com/fatih/color loaded from github.com/fatih/color@v1.12.0,
    but go 1.16 would select v1.13.0

To upgrade to the versions selected by go 1.16:
    go mod tidy -go=1.16 && go mod tidy -go=1.17
If reproducibility with go 1.16 is not needed:
    go mod tidy -compat=1.17
For other options, see:
    https://golang.org/doc/modules/pruning

我已经安装了 go 1.17.9。错误的含义是什么,为什么会被触发?

此错误与 Go 1.17 中引入的 module graph pruning 有关。

在 Go 1.16 中,用于最小版本选择的模块图过去包括完整的模块图,而在 1.17 中,该图仅包括传递依赖(除了一些例外,请参见上面的 link)。

现在要了解触发错误的原因,您可能需要查看 Go 1.17 release notes:

By default, go mod tidy verifies that the selected versions of dependencies relevant to the main module are the same versions that would be used by the prior Go release (Go 1.16 for a module that specifies go 1.17) [...]

因此,当您 运行 go mod tidy 时,它会报告 Go 1.16“将 select”一个传递依赖项 (github.com/fatih/color) 的版本不同于Go 1.17 的 p运行ed 图会。

这与构建可重复性相关,因为 go.sum 包含 go.mod 和前一个 中指定的当前 Go 版本的校验和。在 Go 1.17 和 Go 1.16 的情况下,模块图实际上可以更改,go.sum 将不一致。

错误消息建议两个修复。

  1. go mod tidy -go=1.16 && go mod tidy -go=1.17 — 这个 select 是 Go 1.16 的依赖版本,然后是 Go 1.17

  2. go mod tidy -compat=1.17 — 这只是删除了 Go 1.16 校验和(因此提示“不需要 go 1.16 的再现性”)。

升级到 Go 1.18 后,错误应该不会再出现,因为模块图将像在 Go 1.17 中一样加载。