【问题标题】:How to Use Go Mod Download with Unreleased Pseudo-Versions如何在未发布的伪版本中使用 Go Mod 下载
【发布时间】:2021-06-29 11:28:59
【问题描述】:

自 golang 1.13 以来,我一直遇到这个问题,如果给定的依赖项是分支上未发布的伪版本,我们的 docker 构建脚本(使用 go mod download 获取我们的依赖项)在 git fetch 期间失败。我目前使用的是 golang 1.15。

我正在尝试集成测试对引用的 go 包的一些更改。我会打电话给包裹example-go-sdk。在example-go-sdk 的git repo 中,我创建了一个分支并推送了一些更改。然后在使用example-go-sdk的golang项目中,我已经执行了:

go get local.url.that.utilizes.goprivate/path/example-go-sdk@824eebca783c68c5ef3cf6db35ad688ad30b58b0

该哈希是我的分支上的头部提交的哈希,我已经仔细检查过它是正确的并且确实有我的更改。 这个项目在本地编译就好了。即使是 go mod 下载也适合我。

但是,当从 golang:1.15-alpine docker 容器执行 go mod download 时(确保正确设置 GOPRIVATE 后),我收到此错误:

go: local.url.that.utilizes.goprivate/path/example-go-sdk@v1.1.2-0.20210329043657-824eebca783c: invalid pseudo-version: git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/* in /go/pkg/mod/cache/vcs/369a4408a70eeb73ab52db67cb0c1ba8eb165df174d65c9ec995526a9545424b: exit status 128:
    fatal: unresolved deltas left after unpacking
    fatal: unpack-objects failed

有没有办法解决这个问题?由于其他一些要求,我无法在尝试引用它之前先将example-go-sdk 中的这个分支合并到 master 中。我已经确保 docker 构建使用的是正确版本的引用项目以及更新的 go.mod 和 go.sum。

尽管这一切对我来说都在本地工作,但其他几个团队成员在引用伪版本时也遇到了构建问题,所以我不确定是什么问题。

【问题讨论】:

  • 这看起来更像是git 的问题,而不是 Go 的问题,但是您是否尝试过当前的 Go 版本来确定?您确定所有提交都正确推送吗?您使用的是旧版本的 git 吗?验证您是否可以自己使用 git 手动获取该提交,因为 go 工具只调用 git,而 git 是这里失败的原因。
  • 我自己和其他所有人都能够获取该分支并验证提交哈希是该分支上的头部提交。我们在 golang 1.13、1.14 和 1.15 中出现了这个问题,直到 1.13 才出现。我不热衷于升级过去,因为我们还不允许发布任何其他过去的东西。在我看来,这像是某种缓存问题,但不确定。如果我像 v1.2.0-pre 这样标记提交并以这种方式引用它,它就可以工作。

标签: git go go-modules


【解决方案1】:

go 命令在可预见的将来会继续支持提交的伪版本。这看起来像是您的存储库中的数据损坏,或者您的 git 服务器和/或客户端中的错误。

由于失败的命令是 git fetch,它试图解析 repo 中的现有分支和标签,我猜这个问题会影响 repo 中的一些非默认分支或一些现有标签。这可以解释为什么您的预发布标签解决方法有效:如果 go 命令可以找到特定的匹配标签,那么它不需要回退到获取“所有分支和标签”,并且可能不会触发潜在的git 问题。

您也许可以通过在您的 repo 的新克隆中尝试失败的 git 命令来开始缩小范围:

git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/*

请注意,您可以将-x 标志传递给go 命令以使其(非常冗长!)打印它执行的所有git 命令。这可以帮助您重现触发底层错误的准确存储库配置。

【讨论】:

    【解决方案2】:

    我无法通过伪版本完成这项工作。从 golang 1.13 开始,这种使用伪版本而不是语义版本的功能似乎不再起作用,除非您的模块仍然具有 v0 的主要版本。它可能与 GOPRIVATE 的使用有关,也可能无关——我还没有验证过。

    但是,一种解决方法是使用pre-release versions,如官方golang blog 中所述。基本上是添加一个新的语义版本,但在破折号后附加一个字符串:v2.2.2-example.pre.release

    通过这样做,go mod download 能够找到标签并安装版本。此外,预发布标签不假定向后兼容,因此用户不会自动升级到该版本。他们需要明确请求预发布标签。

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 2021-03-31
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      相关资源
      最近更新 更多