【问题标题】:How to fix go release versioning on Github that has backward tag version?如何修复具有向后标签版本的 Github 上的发布版本控制?
【发布时间】:2021-12-06 05:42:55
【问题描述】:

我有一个 Go 模块发布到 Github。 一开始我把它标记为v1.0.0 它在我直接从 Github 导入该模块的主程序上完美运行。

但在下一个版本中,我将其 backward 标记为 v.0.1.1 因为我认为我的模块还不稳定 ->(基于语义不稳定版本必须以 0.xy 开头)。

今天这是一个问题,因为我使用 golint 和这个 tool,它说 go-mod-outdated。目前,版本是 v0.5.x,之前有很多发布(在我使用 lint 和一些 lint 工具之前)

有什么解决办法吗?

【问题讨论】:

  • 您可以将try renaming v1.0.0 降到更低的位置——尽管我不确定go 会对此有何反应。
  • @Kelsnare 根据我的回答:retract in go.mod 允许您处理。
  • @EliasVanOotegem 这太棒了。
  • @Kelsnare 当我开始使用 golang 时,我们所拥有的所有依赖管理都是在每个项目的 $GOPATH env vars 之间切换。从那时起,事情肯定已经走了很长一段路,是的:go mod 是一个了不起的飞跃:)

标签: go github release golint


【解决方案1】:

Semver 方面

根据 semver,不稳定的较新版本可以用连字符标记,如spec item 9

预发布版本可以通过在补丁版本之后附加一个连字符和一系列点分隔标识符来表示。标识符必须仅包含 ASCII 字母数字和连字符 [0-9A-Za-z-]。标识符不得为空。数字标识符不得包含前导零。预发布版本的优先级低于相关的普通版本。预发布版本表明该版本不稳定,可能无法满足其相关正常版本所表示的预期兼容性要求。示例:1.0.0-alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92、1.0.0-x-y-z.–.

所以这里的问题是你改变了什么?如果您刚刚添加了一些功能,但没有对 API 引入任何重大更改,则应将不稳定版本标记为:v1.1.0-alpha.1。然后可以将不稳定版本的修复标记为v1.1.0-alpha.2 等等。

如果您以破坏性方式更改了软件包的 API,则该版本应标记为 v2.0.0-alpha.1。对 alpha 的修复应以与以前相同的方式进行标记:增加 -alpha 后缀之后的最后一位数字。

最后,如果您没有以任何方式更改 API,也没有添加任何功能,那么您只需将您的版本标记为 v1.0.1-alpha。基本上,标准的 semver 东西。
当然,如果您处于这种特殊情况,那么事实是您过早地将您的包标记为v1.0.0,因为推送补丁仍然会导致不稳定。

您可以通过删除标记来寻址/重新标记现有的v1.0.0 版本,并相应地标记该版本。这可以使用以下命令轻松完成:

# check out the version to re-tag
$ git checkout v1.0.0
# tag the version with the desired tag
$ git tag v0.1.1
# push the tag
# if you're brave, you could just git push --tags, but that's not ideal
$ git push origin v0.1.1
# now delete the offending tag
$ git tag -d v1.0.0
# remove the tag remotely
$ git push origin :refs/tags/v1.0.0

好的,github 存储库不再有v1.0.0 标签。存储库的任何克隆可能仍然具有旧标签,如果有人推送git push --tags,那将恢复v1.0.0 标签(因此我的评论说git push --tags 并不理想)。如果您的包在野外使用,则需要与包的所有用户进行一些沟通。

最后,继续前进,您最好阅读go mod 如何处理版本(其要点是:遵循 semver 2.0,您应该没问题)。伪发行版和预发行版具有特定格式 you should use

Golang(go mod)细节

一旦一个模块被标记并发布,它就在那里。你应该做的是使用retract directive 发出一个损坏版本的撤回

正如@bcmills 在 cmets 中指出的那样:retract 指令仅适用于更高版本。您的特定情况的解决方案(实际上是在版本v0.5.x,但想要撤回发布v1.0.0)可以通过标记更高版本并撤回它来完成:

retract (
    v1.0.0
    v1.0.1 // the new version that issues the retraction retracts itself
)

从现在开始,尚未收回的最新版本包将是 v0.5.x,您应该已准备就绪。

发布撤回带有乐观标签的版本。例如,如果您将此版本重新标记为v0.1.0,那么您也许可以使用replace directive。老实说,我从来没有使用过replace 将我的模块的一个版本指向同一模块的另一个版本,但这可能值得一试:

replace (
    github.com/your/package v1.0.0 => github.com/your/package v0.1.0
)

我必须说:即使这可行,它也是一个 hack,我不能保证它与你发布的新版本的软件包一起玩得很好。我强烈建议您撤回v1.0.0 标签,重新标记它(可以说v0.0.0 是这里要使用的版本),从现在开始,遵循 semver 和 golang 预发布/伪-发布版本控制标准。

【讨论】:

  • go 命令仅从最新版本加载 retract 指令——所以要让它接收 v1.0.0 的撤回,您需要将撤回本身标记为更高版本——比如v1.0.1,还有retract本身:retract [v1.0.0, v1.0.1]
猜你喜欢
  • 1970-01-01
  • 2011-02-27
  • 2018-02-03
  • 2020-05-23
  • 1970-01-01
  • 2021-03-25
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多