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

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

带着这个疑惑到StackOverflow造访了一下,良久无回音。再加上自己写点小东西时也需要正确地命名版本号来管理发布,看来是有必要补充一下这方面的知识了。

语义化版本号

当我在发布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.01.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列出的问题很实在,可以解决使用本版本号命名中的疑惑。

 

Reference:

 

 

时间: 2024-09-28 23:17:29

语义化的软件版本号规则,你是否真的了解软件的版本号的相关文章

《JavaScript开发框架权威指南》——1.5 语义化版本控制

1.5 语义化版本控制 如果安装了jQuery(见清单),那么请查看项目的Bower清单.你所看到的应当与清单相仿. 清单1-7 语义化版本号 "dependencies": { "jquery": "~2.1.3" } 清单中的版本号2.1.3(请暂时忽略-)就是所谓的语义化版本号(Semver,Semantic Version).语义化版本控制能够帮助开发者按照通用格式为其项目指定版本号.该格式如下所示. Version X.Y.Z(Majo

javascript比较语义化版本号的实现代码_javascript技巧

前言 所谓"语义化版本号",就是在版本号中体现出语义,或者说版本号本身是有意义的,不再是随意给的一个数字.这个规范将版本号中每个数字的意义都做了比较严格的说明.当然,其中大部分内容还是沿用我们之前说过的业内的约定,所以,对于有版本号意识的开发者来说,接受这个规范是很容易的. 在移动端APP第三方开发中经常会碰到一些因为版本不同而造成JS SDK或JS API差异或支持的问题.对于移动前端来说,在实际第三方开发中可能会需要根据APP的版本号做一些特殊的业务逻辑处理. 语义化版本号 一般语

用javascript比较语义化版本号

移动端APP第三方开发中经常会碰到一些因为版本不同而造成JS SDK或JS API差异或支持的问题.对于移动前端来说,在实际第三方开发中可能会需要根据APP的版本号做一些特殊的业务逻辑处理. 语义化版本号 一般语义化版本号通常定义是这样的: Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]   主版本号            .子版本号              [.修正版本号       [.编

Angular 2最终版发布,采用语义化版本号

Angular 2终于结束了看似无尽的开发阶段,发布了最终版. Angular 2第一个发布候选版本(RC:Release Candidate)是在2016年3月公布的,之后就在持续使之变得更稳定.完整.在博客中,Jules Kremer指出该最终版本的意义: "最终"意味着什么?意味着框架稳定性已经在广泛的用户案例中得到验证,框架已优化了开发人员效率.加载大小以及性能.同时拥有预编译(ahead-of-time compilation)和内置的懒加载,我们已经可以确保用户在各个浏览器

智能选择器和语义化的CSS

"结构永远服从于功能,这是不变的法则",建筑工程师"摩天大楼之父"Louis Sullivan如是说.因为工程师不希望让无辜的人们被碾压在巨大的建筑物下,这种大拇指式的规则是相当有用的.在设计中你应该总是以功能为重,然后让结构在结果中呈现.如果你以结构为重,虽然这能够建造出一栋漂亮的摩天大楼,但代价是埋下了许多相当危险的种子. 这些都是关于建筑师的,那么对前端架构师或者"非真正的架构师"来说呢?我们需要遵守这个法则还是忽略它? 随着面向对象的CS

语义化的CSS:聪明的选择器语义化CSS

文章简介:结合智能选择器的语义化的CSS. "结构永远服从于功能,这是不变的法则",建筑工程师"摩天大楼之父"Louis Sullivan如是说.因为工程师不希望让无辜的人们被碾压在巨大的建筑物下,这种大拇指式的规则是相当有用的.在设计中你应该总是以功能为重,然后让结构在结果中呈现.如果你以结构为重,虽然这能够建造出一栋漂亮的摩天大楼,但代价是埋下了许多相当危险的种子. 这些都是关于建筑师的,那么对前端架构师或者"非真正的架构师"来说呢?我们需要

网页的HTML结构进行重构:语义化标签的意义

文章简介:语义化标签的实战意义. 我收集到一些观点,大家姑且先听上一听,有人说:"没必要考虑语义化,只要我写的代码浏览器运行后没问题就行,反正领导根本不关心这些""语义化是w3c推广的,我是很想语义化我的代码,但总是用不明白""这个不好说,语义化再好有啥用,关键是有好的项目,客户才是金主!""除了专业人士,谁会去看我们的代码是不是语义化的" 不仅仅有页面重构人员的声音,也听一听工程师.设计师.还有项目管理人员,他们是怎么看&q

CSS命名的语义化和html5为语义和体验而生

文章简介:html5–为语义和体验而生. 开篇前的一些YY 曾几何时,一个人出设计稿,出完设计稿打开DW用拖出一个页面,再苦逼一点拖完页面后自己还要写后台,武林人称:美工.更苦逼的是当每一次需求变更后,去修改一大堆发麻的 ,于是"div+css"被搬上了互联网时代的舞台,一夜间N多的<DIV+CSS>葵花宝典横空出世,那时,我们活在了div+css的年代,那时,我们用上了 之后,腰不酸,腿不痛,加班也带劲了. YY结束,切入正题 Ghost曾在2年前就以<页面重构中的

【原】常见的模块,你语义化了没

记得在读大学期间,去找实习,面试时被问到"什么是标签的语义化",一头汗水,也忘记那时是怎么瞎扯了,后来回宿舍,上网查"标签语义化",当时的网络对标签语义化的解释并不多,在找了很多网络资料和书籍后才对语义化有一定的了解.现在标签语义化这个专业名字,在前端开发的领域中已经不陌生了. 什么是标签语义化?为什么要标签语义化?如何语义化标签?这是一名合格的前端开发工程师需要思考的.<HTML标签语义化对照表>解释了HTML标签的语义,有助于大家理解语义化,<