版本号概述
本文最后更新于:几秒前
现在生活中,我们每天会使用很多款APP,并且这些手机软件会周期性地进行升级改版。这就是提到的新版本,那么我们会发现很多软件都有特定格式的一个版本号,比如微信的6.7.3和7.0.0。那么为什么6.7.3之后就直接是7.0.0了呢?6.7.4不存在吗?为什么现在最新的版本是7.0.20,而不是7.2.0?
本文会详细介绍版本号的一些知识,了解各个号的含义。进而了解软件服务商发布每个版本都做了什么。同时,如果你是一个软件服务商,能够更科学的发布你的版本。
规范
从早期的洪荒年代,软件的版本号没太多的说法。甚至有可能是v1、v2、v3…,后来,很多软件使用年份作为版本,比如:拳皇94、拳皇95、拳皇96、拳皇97…

总而言之,不管经过了怎样的变革。现在代码开发中常用的是版本规范是:**语义化版本2.0.0。**
概述
可以进入官网查看语义化版本2.0.0的详细说明。如果只想简单了解,可以查看本章节后续内容。
格式:<主版本号>.<次版本号>.<修订号>。规则:
- 当有不兼容的API修改后,要修改主版本号
- 当增加了新的功能特性(但不影响API),就修改次版本号
- 当对某个功能进行修正(针对错误的结果进行向后兼容的修改)后,修改修订号
针对上述三条规则,我们需要遵循以下约束:
- 语义化版本的软件、必须定义公共API。
- 版本号必须是标准格式,即:<主版本号>.<次版本号>.<修订号>
- 软件进行任何修改后,发布时都应该改变其版本号
- 主版本号为0的程序为开发初始阶段,一切随时可能变化。这样的公共API是不稳定的。
- 从1.0.0版本开始,公共API就稳定了。之后的修改都要依据公共API
- 修订号必须在只做了向下兼容的修正时才递增。
- 次版本号必须在有向下兼容的新功能出现时递增。当有公共API被标记为弃用状态,也应该递增。如果内部有大量的新功能或者改进也可以递增。当次版本号递增时,修订号必须归零。
- 主版本号必须在有任何不兼容的公共API修改时递增。当主版本号递增,次版本号和修订号必须归零。
有时我们会发现,一个软件的版本号不只是X.Y.Z这么简单,比如说 1.0.3-alpha.1也是一个符合规范的版本号。其中alpha.1被称为先行版本号,先行版本号意味着版本并不稳定甚至都无法满足预期。版本号和先行版本号之间使用-链接。先行版本号由ASCII码字母数字组成,也可以用.进行分割。
<主版本号>.<次版本号>.<修订号>[-<先行版本号>]
先行版本号一些修饰的词:
alpha:内部版本
beta:测试版
demo:演示版
enhance:增强版
free:自由版
full version:完整版,即正式版
lts:长期维护版本
release:发行版
rc:即将作为正式版发布
standard:标准版
ultimate:旗舰版
upgrade:升级版
还会有其他东西吗?有的。我们还可以在版本号后面增加版本编译元数据。比如1.0.3-alpha.1+10086、1.0.3+10086 编译元数据和先行版本号一样,可以由字母数字组成,用.分割和前面部分使用+号连接。
<主版本号>.<次版本号>.<修订号>[-<先行版本号>][+<编译元数据>]
版本号的比较
先看这组不等式
2.0.0 > 1.1.0 > 1.0.0 > 1.0.0-rc.1 > 1.0.0-beta.11 > 1.0.0-beta.2 > 1.0.0-beta > 1.0.0-alpha.beta > 1.0.0-alpha.1 > 1.0.0-alpha
相信前面部分很好理解,大版本号、此版本号、修订号依次比较,数越大代表版本越新。
用-连接的先行版本号呢?首先,如果前面的正式版本号都一致,有先行版本号的版本是比没有先行版本号的版本老的,即:(1.0.0 > 1.0.0-rc.1)。那么两个先行版本号的比较是依次比较字符的ASCII码值,码值越大,版本越新。即:1.0.0-rc.1 > 1.0.0-beta.11 > 1.0.0-beta.2 > 1.0.0-beta
那么编译元数据呢?编译元数据不参与版本号的比较,也就是说:1.0.0+android ===1.0.0+ios
我们可以通过安装这个npm包进行版本号的比较。
版本号意味着什么?
现在的软件开发中存在着大量的依赖,版本号是我们能够安全升级依赖的重要保障(尽管有时也不那么安全),作为一个软件开发者,版本号也可以培养我们这样的意识:在软件开发整个过程中,先设计好公共API,再基于次扩展。这样我们整个思路就比较清晰,能够很有章法地开发程序。
总结
- 拥抱标准,我们既是版本号的受益者,也是版本号的维护者。
- 经过多次演变,目前比较认可的版本方案是<主版本号>.<次版本号>.<修订号>。但是说不好未来是否还会发生变化。
- 软件设计中可以先定义好公共API
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!