跳转至

日历化版本 1

1. 简介

CalVer 不是基于任意数字,而是基于项目发布日期的版本控制约定

版本随着时间的推移会变得更好。

对于维护者,版本使我们在不断扩大的生态系统中可以指定精确的依赖关系。对于卖家和推广者来说,项目的版本是一个品牌的活力部分。对我们所有人来说,版本使我们在升级到将来时可以参考过去。

不同的项目使用不同的系统命名版本,但是常见的实践已经浮现出来。例如,以点分隔的数字(例如:语义化版本 2.0.0)就是全部。另一种常见的版本模式包含一个基于时间的元素,通常是发布日期的一部分。

这种基于日期的方法被称为“日历化版本(Calendar Versioning)”,或者简称 CalVer

2. 方案

有多种日历化版本方案,长期被各种大小项目使用。与其宣布某个方案为 CalVer,更重要的是要认识到每个方案的可行性并设计一个适合项目的方案

2.1. 版本部分

主要(Major):版本中的第一个数字。2 和 3 是 Python 的著名主要版本。主要部分是基于日历的最常见组件。

次要(Minor):版本中的第二个数字。7 是 Python 的最受欢迎的次要版本。

微小(Micro):版本中的第三个且通常是最终数字。有时称为 “补丁” 部分。

修饰符(Modifier):可选的文本标记,例如 “dev”、“alpha”、“beta”、“rc1”,依此类推。

绝大多数现代版本标识符是由两个或三个数字段组成,以及可选的修饰符。通常建议不要使用四个数字段的版本。

2.2. 标准术语

如下面的 样例学习 所示,项目发现了不止一种有用的方法在版本中使用日期。 作为对比,CalVer 并未像 “语义化版本” 那样选择单一方案,而是引入了开发人员的标准术语:

YYYY:年份全称 - 2006、2016、2106

YY:年份缩写 - 6、16、106

0Y:以零填充的年份 - 06、16、106

MM:月份缩写 - 1、2 ... 11、12

0M:以零填充的月份 - 01、02 ... 11、12

WW:星期(自年初开始)- 1、2、33、52

0W:以零填充的星期 - 01、02、33、52

DD:日 - 1、2 ... 30、31

0D:以零填充的日 - 01、02 ... 30、31

请注意,传统的递增版本号是从 0 开始,而日期段是从 1 开始的,且年份缩写和以零填充的年份是相对于 2000 年。还请注意,星期的使用通常与月/日互斥。

假定采用 公历UTC 的惯例也是如此。从技术上讲可以使用任何日历,只要提供的项目声明使用哪一个。

3. 样例学习

CalVer 有很多用户。考虑到知名度和使用案例的多样性选择以下项目。

3.1. 产品

产品 CalVer 格式 例子
Ubuntu YY.0M 4.10 - 17.04
Microsoft Windows YY/YYYY 95, 98, 2000
OpenSCAD YYYY.0M 2015.03
JetBrains PyCharm YYYY.MINOR.MICRO 2017.1.2
Unity YYYY.MINOR.MICRO 2019.2.2
Slack for Mobile YY.0M.MICRO 19.08.10
Tesla Firmware YYYY.WW.MICRO 2020.12.10

3.2. 标准

产品 CalVer 格式 例子
Ada YY/YYYY 83, 95, 2012
C YY 89, 99, 11
C++ YY 98, 03, 11, 14, 17

3.3. 库

产品 CalVer 格式 例子
Boltons YY.MINOR.MICRO 17.2.0
Twisted YY.MM.MICRO 16.1.1
certifi YYYY.MM 2016.4
pytz YY.MINOR.MICRO 18.0 - 19.0.3
pip YY.MINOR.MICRO 18.0 - 19.0.3

4. 何时使用?

如果你和你不认识的人都严肃地使用你的项目,那么使用一个严肃的版本。幸运的是,为那个版本决定是否使用 CalVer 比以往任何时候都要容易。

  1. 你的项目是否具有较大或不断变化的范围?
  2. 你的项目是否对时间敏感?是否有其他的外部变化驱动项目新版本的发布?
    • 业务需求,例如 Ubuntu 对支持计划的支持。
    • 安全更新,例如 certifi 对证书更新的需求。
    • 政治变化,例如 pytz 对时区变化的处理。

如果你对这些问题中的任何一个回答是肯定的,CalVer 的语义就会使 它成为你项目的有力选择。