0

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

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

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

有什么想法可以解决吗?

4

1 回答 1

2

事情的严重性

根据 semver,根据规范第 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-xyz.–。

所以这里的问题是你改变了什么?如果您刚刚添加了一些功能,但没有对 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标签。存储库的任何克隆可能仍然具有旧标签,如果有人 push git push --tags,那将恢复v1.0.0标签(因此我的评论说不git push --tags理想)。如果您的包在野外使用,这需要与包的所有用户进行一些沟通。

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

Golang (go mod) 细节

一旦一个模块被标记并发布,它就在那里。您应该做的是使用指令收回损坏的版本retract

正如@bcmills 在评论中指出的那样:该retract指令仅适用于更高版本。您的特定情况的解决方案(实际上是在 version 上v0.5.x,但想要收回 release 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指令。老实说,我从来没有将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 预发布/伪发布版本控制标准。

于 2021-10-19T10:10:22.923 回答