Skip to content
MuPRO Knowledge

版本

版本管理是软件开发的一个重要方面,可以跟踪项目的不同版本或状态。它可以帮助开发人员维护更改的历史记录、跟踪更新、修复错误,并在必要时恢复到以前的版本。编程中使用的版本管理策略有多种,包括语义版本管理(Semantic Versioning)、日历版本管理(Calender Versioning)和哈希版本管理(Hash Versioning)。在 MuPRO,我们更喜欢哈希版本控制,但了解其他选项也是有益的。

语义版本控制

语义版本控制(Semantic Versioning)通常缩写为SemVer,是一种软件版本控制方案,旨在传达一个版本中底层变更的含义。语义版本控制规范被许多软件库和系统广泛采用。SemVer 使用一个由三部分组成的版本号,如 MAJOR.MINOR.PATCH。以下是每个元素的含义:

  • MAJOR:在对 API 进行不兼容的更改时,该值会增加。“major”通常与软件的重大变更有关,包括可能破坏向后兼容性的功能。
  • MINOR:当您以向后兼容的方式添加功能时,该值会增加。“Minor”通常会添加新功能,但不会破坏或更改现有功能。
  • PATCH:在进行向后兼容的错误修复时,该值会增加。“Patch”通常与错误修复和性能改进相关,不会添加新功能或破坏现有功能。

预发布版本可能看起来像 1.0.0-alpha.1,而带有构建元数据的版本可能看起来像 1.0.0+20130313144700。

在 MuPRO 中使用语义版本管理存在以下问题:

  • 我们不是专业的软件开发人员,很难让所有的贡献者都遵守语义版本规则。
  • 如果使用不当,当不同的人提到同一个版本时,他们实际上指向的可能是不同的提交。例如,在我们以前的 MuPRO 代码中,我们发布的版本是 1.0.6,偶尔会有一些小更新,但我们并没有费心在所有地方更改版本号。
  • 版本号需要决策,例如,有时很难确定某些改动是次要改动还是主要改动,或者是次要改动还是补丁改动。
  • 我们没有使用任何工具来帮助我们管理依赖关系,例如使用 npm 来管理 package.json 文件中的依赖关系,因此我们不必使用语义版本号。

日历版本控制

日历版本管理(Calendar Versioning)通常缩写为 CalVer,是一种在版本字符串中包含版本发布日期的软件版本管理方案。这样,用户和开发人员就能快速了解软件版本的历史以及上次更新的时间。

CalVer 系统使用 MAJOR.YY.MINOR.MICRO 这样的方案。以下是每个部分通常代表的含义:

  • MAJOR:这是一个数字,随着重要版本的发布而递增,类似于语义版本。
  • YY:这是版本发布的年份。有些方案使用 YYYY 表示 4 位数的年份。
  • MINOR:这可以代表版本发布的月份,也可以是一个随着每次版本发布而递增的数字。
  • MICRO:该数字代表同年同月发布的较小版本或错误修复。每次发布都会递增。

Ubuntu 操作系统就是使用日历版本控制的一个突出例子。Ubuntu 版本标有发布的年份和月份。例如,Ubuntu 21.04 于 2021 年 4 月发布。该系统的优点是用户可以快速了解软件版本的时间,以及下一次更新的时间。

在 MuPRO 中使用日历版本系统存在以下问题:

  • 我们没有可预测的发布时间表。

哈希版本控制

哈希版本控制实际上没有标准,我们定义了自己的规则,即 YYYY.mmdd.commit_short_hash

  • YYYY 是年份
  • mmdd 是月和日
  • commit_short_hash 是 git rev-parse —short HEAD 的输出结果

为什么我们要这样使用版本控制

1.无需决策,每个新版本都能自动确定,因此非常适合我们的 CI/CD 工作流程。
2.版本日历的好处是,每个人都能知道每个版本的发布日期。
3.由于每个提交的哈希值都是唯一的,因此不同贡献者在一起调试时不会产生任何混淆。