【问题标题】:Cannot require certain version of a non-module Go package不能要求某个版本的非模块 Go 包
【发布时间】:2021-01-17 07:44:03
【问题描述】:

我想要一个尚未转换为使用模块的 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。我确实也注意到了“+incompatible”后缀,但我不确定这与这个问题有什么关系。根据docs

go 命令在没有 go.mod 文件的主要版本 2 或更高版本的版本中添加一个 +incompatible 后缀。 +incompatible 表示一个版本与具有较低主要版本号的版本属于同一模块;因此,go 命令可能会自动升级到更高+不兼容的版本,即使它可能会破坏构建。

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

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

This是我要使用的版本

This是下载的那个

【问题讨论】:

  • 版本无关紧要,因为它不是模块,而是根据对父树的最佳猜测生成合成版本。查看提交 id,您会看到您还从 v19.03.13 获得了最新提交
  • 嘿@JimB,好眼力,你想添加这个作为答案,我可以标记它正确吗?

标签: go go-modules moby


【解决方案1】:

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

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

【讨论】:

  • v19.03.13 不用作伪版本基础,因为它在语法上作为 semantic version 无效。
  • 不幸的是,v17.12.0-ce-rc1 作为语义版本和calendar version 在语法上都是有效的。在 Docker 存储库中,它的意图是后者,但 go 命令将其解释为前者。
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2012-01-09
  • 2018-08-30
  • 2021-11-04
  • 1970-01-01
相关资源
最近更新 更多