为什么 Golang 包必须是 v0 或 v1 而不是 v2020

S. *_*cko 3 go go-modules

我到处都读到包必须有 v0 或 v1 的标签。为什么标签不能是 v2020 或 v0 或 v1 以外的其他东西。我已经尝试过这个个人,但在使用 v2020 时出现以下错误。

Scotts-Mac-mini:seeding syacko$ go mod tidy
go: errors parsing go.mod:
/Users/syacko/workspace/sotesoft/src/utils/seeding/go.mod:10: require gitlab.com/soteapps/packages: version "v2020.2.0" invalid: module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2020
Scotts-Mac-mini:seeding syacko$ 
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 6

这是一个约定,方便大家。Go 模块选择使用广泛接受的Semantic Versioning v2

Go 模块 Wiki:

如果我创建了一个 go.mod 但没有将 semver 标签应用于我的存储库,会发生什么?

semver是模块系统的基础。为了给消费者提供最好的体验,我们鼓励模块作者使用 semver VCS 标签(例如,v0.1.0 或 v1.2.3-rc.1),但不严格要求 semver VCS 标签:

  1. 模块需要遵循 semver 规范,以便 go 命令按照文档进行操作。这包括遵循有关如何以及何时允许中断更改的 semver 规范。

  2. 没有 semver VCS 标签的模块由消费者使用 semver 版本以伪版本的形式记录。通常,这将是 v0 主要版本,除非模块作者按照“主要子目录”方法构建了 v2+ 模块。

  3. 因此,未应用 semver VCS 标签且未创建“主要子目录”的模块实际上是在声明自己属于 semver v0 主要版本系列,基于模块的使用者会将它们视为具有 semver v0 主要版本。

来自 Dave Cheney 的一篇有趣且相关的博文,早于 Go 模块:Gophers,请标记您的版本

我们想要什么?Go 包的版本管理!我们什么时候要?昨天!

[...] 当您开始在项目中使用该包时,我们希望我们选择的 Go 构建工具能够获取最新的稳定版本。[...]

但就目前而言,在 2016 年的今天,人类或工具无法查看Go 代码的任意git(或 mercurial,或 bzr 等)存储库并提出以下问题:

  • 这个项目已经发布了哪些版本?
  • 该软件的最新稳定版本是什么?
  • 如果我有 1.2.3 版,是否有我应该应用的错误修复或安全更新?

这样做的原因是 Go 项目(Go 包的存储库)没有版本,至少不像我们在其他语言中的朋友使用这个词的方式。Go 项目没有版本,因为没有正式的发布过程。

[...] 我建议 Go 项目采用SemVer 2.0.0。这是一个健全的标准,很多人都很好理解,不仅仅是 Go 程序员,语义版本控制将让人们编写工具来在最小的发布过程之上构建依赖管理生态系统。

  • 版本“v4.6.0”与 semver2 兼容。 (2认同)
  • `v2020.0.0` 也兼容 semver2,只是不兼容 `v2020`。 (2认同)