语义化的软件版本号规则 你是否真的了解软件的版本号

简介: 每次打开谷歌浏览器的About页面更新的时候,总是期待着一个新版本的到来,新的东西总是让人感到Amazing。这样久了之后心中不免产生一个疑问,什么时候该发布一个新版本了,有什么规律么?平时的小更新总是版本号后面无关仅要的数字的增长,当这个数字增长到何时可以让主版本号加1?

每次打开谷歌浏览器的About页面更新的时候,总是期待着一个新版本的到来,新的东西总是让人感到Amazing。这样久了之后心中不免产生一个疑问,什么时候该发布一个新版本了,有什么规律么?平时的小更新总是版本号后面无关仅要的数字的增长,当这个数字增长到何时可以让主版本号加1?

image.png

语义化版本号

当我在发布jQuery插件时,发现其官方页面上提供了一个帮助我们更好地命名软件版本号的概念"semver",即Semantic Versioning语义化的版本。看了下其规则觉得很nice。

关于软件的版本号,向来没有统一或者严格的规定,对于大型软件产品,其开发团队内部或许维护了自己的一套规则来界定软件开发到何时可以发布新版本,何时又只是增加次版本号,也或许在遵循一些现成的大家认可的规范;更多情况是对个人开发者而言,在自己捣腾一些小东西时,这样的版本号规则就更自由了,完全视软件作者的水平而良莠不齐。


有的作者或许学习过版本相关的知识,知道遵循一些现成的规范,更多的新手比如像我这样,完全是随毫无规则地在使用版本号。今天开发完一个功能,那就发布一个版本叫做0.1吧,下午发现个bug并修复之再发个版本0.2吧。如此显然不好,无规矩不成方圆啊,我们已经饱受各浏览器不完全遵循W3C规范而带来的各种跨浏览器前端问题了,血的教训,历史告诉我们,不能让悲剧重演,所以迫切需要一个好的准则来指导大家更好地使用软件版本号。


语义化版本号的作者正是抱着这样的希望创造了它。

语义化版本号是由Tom Preston-Werner 发起的一个关于软件版本号的命名规范,关于这个规范详细的说明可以在官网查看,也可访问其GitHub项目页面,而关于该规范的中文版本,可以访问我fork的版本,由官网繁体中文转换而来,并稍加修改以更符合大陆用语。顺便提句,该规范的作者是Gravatars创办者同时是GitHub联合创始人。你或许不知道gravatar但作为程序员你肯定知道GitHub。


基本规则

顾名思义,语义化的版本就是让版本号更具语义化,可以传达出关于软件本身的一些重要信息而不只是简单的一串数字。

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  1. 主版本号:当你做了不兼容的API 修改
  2. 次版本号:当你做了向下兼容的功能性新增
  3. 修订号:当你做了向下兼容的问题修正

先行版(预览版)版本号及版本编译信息可以加到"主版本号.次版本号.修订号"的后面,作为延伸。


具体规范

具体详尽的规范可以参见其官网,当然也可以访问中文版本。这里简单总结一下。

  • 版本号是以点隔开的形式'X.Y.Z' 且XYZ为正整数,数字前面不加0, 也就是说v0.1.0不能写成v0.10.0
  • 一般软件开发过程中以0.1.0 版本开始,开发过程中不断增加新功能,则增加次版本号比如变成0.2.0,然后期间的问题及bug修复体现在修订号上,比如版本号变成0.1.12。这一阶段的版本视为不稳定版本,一般也未对外发布
  • 主版本号表示正式版的形成,也即如果你开发的是供大家使用的软件或插件,那就标致本软件公共API的形成,比如新浪微博API v1.0.0发布,大家就可以在自己网站上调用了,这是个正式而稳定的版本。所以这里有个规定,版本一旦发布,不允许对软件做任何修改。任何改过之后的代码都应标记新的版本号在下次发布中体现
  • 主版本号的增加可以是次版本号以有修订号增加到一定数量后的结果,也可以是有不兼容旧版的新功能或API加入的结果,并且主版本增加后次版本号和修订号归零
  • 次版本号表示有兼容旧版本的功能或API增加,而修订号表示bug修复并且这种修复一般是对代码结果不正确的修复而且一定是兼容旧版本的,如果你修复bug越改越大结果不兼容旧版本了,则需要增加主版本号
  • 其他信息比如预览版,先行版或者软件编译信息可以跟随在修订号之后。示例:1.0.0-alpha+001、1.0.0+20130313144700、 1.0.0-beta+exp.sha.5114f85


使用语义化版本号的好处

也即原规范中对为何要使用语义化版本号的描述。在我看来,无非就是在遵循了本规范后,透过版本号,你可以非常清楚地了解到你手头拿到的软件版本相比于上一个版本发生了怎样的变化,所以你在使用的时候可以更注意一下这些变化,以免出现不兼容的情况。

比如如果主版本号升级了,可以知道软件新增了功能且该功能或者重大问题修复,且都是与旧版本不兼容的。好比大家热切推崇的文本编辑器Sublimetext2和3,他的很多插件在这两个版本间无法兼容使用,所以一般要标明插件是使用在Sublimetext2还是3中。同时主版本号的更新也可以表明是次版本号更新到了一定程序,比如新增功能数量达到了一定指标,我们可以认为可以升级一下主版本号了,毕竟一个可以copy as rtf,带项目文件管理sidebar,更换主题的文本编辑器和Windows自带文本编辑器在功能上还是有质的区别的。


如果次版本更新了,我们可以知道有小部分新功能添加,或者修订号更新,有小部分bug被修复,而在获取这些信息时完全还没有查看change log。这正是语义化的好处,版本号就告诉你大部分信息了,当然更具体的参见change log吧。


另外个好处就是当大家都在遵循一个规范的时候,无疑扫清了一些认知上的障碍,将事情简单化,大家也心照不宣地能看懂每个人代码中的版本号的意思,初学者也很容易掌握这方面的知识。


一些问题

各版本优先级

也即如何判定哪个版本版次更高。下面是来自原规范的解释,已经够详尽就不另外阐述。

判断优先层级时,必须把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较(版本编译信息不在这份比较的列表中)。由左到右依序比较每个标识符号,第一个差异值用来决定优先层级:主版本号、次版本号及修订号以数值比较,例如1.0.0 < 2.0.0 < 2.1.0 < 2.1.1。当主版本号、次版本号及修订号都相同时,改以优先层级比较低的先行版本号决定。例如:1.0.0-alpha < 1.0.0。有相同主版本号、次版本号及修订号的两个先行版本号,其优先层级必须透过由左到右的每个被句点分隔的标识符号来比较,直到找到一个差异值后决定:只有数字的标识符号以数值高低比较,有字母或连接号时则逐字以ASCII的排序来比较。数字的标识符号比非数字的标识符号优先层级低。若开头的标识符号都相同时,栏位比较多的先行版本号优先层级比较高。范例:1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0- rc.1 < 1.0.0。


如何界定正式版1.0.0的发布

这个正是我在开发自己的jQuery插件时面临的问题。如上面规范所述,软件最初开发阶段一般以0.1.0开始。当软件基本正式功能全部完成且测试通过,对外公共API完成可以用于实际线上环境了,则可以形成1.0.0的正式版了。


更多关于本规范的常见问题还是请查看文档,上面的FAQ列出的问题很实在,可以解决使用本版本号命名中的疑惑。


 

参考

相关文章
|
内存技术 Perl
MTK DDR不能兼容分析
MTK DDR不能兼容分析
365 0
|
JavaScript API
Vue开发股票展示页面
Vue开发股票展示页面
578 0
|
9天前
|
搜索推荐 算法 数据可视化
《游戏公会系统激活活跃度与筑牢归属感的实战指南》
本文基于亿级玩家行为轨迹的深度拆解,聚焦公会系统在维系玩家活跃度与归属感中的核心赋能逻辑,从行为激励体系搭建、情感链路设计、协作阈值优化、自驱循环机制构建、数字身份锚定等维度,结合多类型游戏的实践案例与数据对比,揭示公会从“玩家聚合工具”升级为“游戏生态共生体”的底层路径。文章摒弃表层功能描述,深挖玩家行为心理与技术落地策略,提出“低门槛高频触发+高价值低频沉淀”等创新设计理念,为游戏社群架构设计提供兼具实用性与前瞻性的实践指南,助力破解玩家流失困局,延长游戏生命周期。
90 11
|
11天前
|
人工智能 算法 数据挖掘
Geo优化名师评测:于磊“双核四驱”体系与行业五大流派深度解析
本文旨在基于严谨的学术视角和行业实践,对当前Geo优化领域的五位代表性专家及其方法论进行深度、多维度的评测,为企业和从业者提供一份具备E-E-A-T标准的指南,揭示在AI时代构建内容信任资产的有效路径。
106 0
|
6月前
|
JSON 供应链 API
商品条码查询 API 实战指南:掌握商品“唯一身份标识”
商品条码查询API简介:基于1974年诞生的条码技术,该API通过输入13/14位条码,快速获取商品基本信息(名称、品牌、规格等)和成分信息(营养成分、配料表等)。其核心功能包括商品条码查询接口与成分查询接口,广泛应用于零售、电商、物流及健康饮食等领域。支持HTTP POST请求,提供便捷的代码调用示例。作为数字化转型的重要工具,它不仅方便消费者查询商品详情,还助力商家优化库存管理与销售流程,提升运营效率。
1523 3
|
10月前
|
人工智能 自然语言处理 并行计算
MeteoRA:多任务AI框架革新!动态切换+MoE架构,推理效率提升200%
MeteoRA 是南京大学推出的多任务嵌入框架,基于 LoRA 和 MoE 架构,支持动态任务切换与高效推理。
496 3
|
资源调度 Java 调度
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
238 0
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
|
机器学习/深度学习 算法 数据挖掘
数学建模入门,看这一篇就够了!
数学建模入门,看这一篇就够了!
530 0
|
SQL 分布式计算 数据处理
【Hive】sort by 和 order by 的区别
【4月更文挑战第15天】【Hive】sort by 和 order by 的区别
|
存储 算法 NoSQL
(三)漫谈分布式之集群篇:探寻N个9高可用与PB级数据存储的实现原理!
本文来详细聊聊集群的各方面知识,为诸位量身打造出结构化的集群知识体系。
593 0