不能要求特定版本的非模块 Go 包

Cannot require certain version of a non-module Go package

我想要求某个版本的 Go 包尚未转换为使用模块,我想在我的 go.mod 文件中要求它。具体来说,包是“github.com/docker/docker/pkg/system@v19.03.13”

当我运行以下命令时,我得到以下输出:

$ go get -v github.com/docker/docker/pkg/system@v19.03.13
go: found github.com/docker/docker/pkg/system in github.com/docker/docker v17.12.0-ce-rc1.0.20200916142827-bd33bbf0497b+incompatible

如您所见,下载的是 v17.12.0-ce 版本,而不是 v19.03.13。我确实也注意到了“+不兼容”后缀,但我不确定这与这个问题有什么关系。根据 docs

the go command adds an +incompatible suffix to versions with major version 2 or higher without a go.mod file. +incompatible indicates that a version is part of the same module as versions with lower major version numbers; consequently, the go command may automatically upgrade to higher +incompatible versions even though it may break the build.

所以我知道这个包没有 go.mod 文件,但是下载的版本 (17.x) 大于 2,所以我认为 +incompatible 不是问题。

我的问题是:当我指定版本 v19.03.13 时,为什么 Go 安装 v17.12.0-ce

This是我要用的版本

This是下载的那个

go.mod pseudo-version 中列出的版本对于不是 go 模块的存储库无关紧要。版本 v19.03.13 不是语法上有效的语义版本,因此 go 工具将沿着提交树向上查找,它遇到的第一个有效的 semver 恰好是 v17.12.0(这不是故意的一个语义版本,但它至少是有效的)。只要 go 本身可以重现和解析结果,领先版本不是 pseudo-version 中预期的这一事实就不是问题。

如果您查看尾随的提交哈希,您有 bd33bbf0497b,这是 v19.03.13 标记的正确提交 ID。