共计 2310 个字符,预计需要花费 6 分钟才能阅读完成。
因为最近在做 Node 相干的我的项目,波及到版本号的解决,依据版本号大小做降级 js 解决的,而因为多加了一位数,导致线上的 js 不能降级。
所以只能重写一个反对任意位数的版本号比照办法。
顺便先来一个语义化版本号的扫盲吧。
为什么须要语义化版本号?
在软件治理的畛域里存在着被称作“依赖天堂”的死亡之谷,零碎规模越大,退出的套件越多,你就越有可能在将来的某一天发现自己已深陷失望之中。
在依赖高的零碎中公布新版本套件可能很快会成为恶梦。
如果依赖关系过高,可能面临版本控制被锁死的危险(必须对每一个相依套件改版能力实现某次降级)。
而如果依赖关系过于涣散,又将无奈防止版本的凌乱(假如兼容于将来的多个版本已超出了正当数量)。
当你专案的停顿因为版本相依被锁死或版本凌乱变得不够简便和牢靠,就意味着你正处于依赖天堂之中。
作为这个问题的解决方案之一,就是用一组简略的规定及条件来束缚版本号的配置和增长,也就是 语义化版本号
。
语义化版本号
个别语义化版本号通常定义是这样的:
js 代码:
Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]
主版本号 . 子版本号 [. 修改版本号 [. 编译版本号]]
定界符个别应用 .
版本格局: 主版本号. 次版本号. 订正号
,版本号递增规定如下:
- 主版本号 (major):当你做了不兼容的 API 批改
- 次版本号 (minor):当你做了向下兼容的功能性新增,能够了解为 Feature 版本
- 订正号 (patch):当你做了向下兼容的问题修改,能够了解为 Bug fix 版本
后行版本号及版本编译信息能够加到“ 主版本号. 次版本号. 订正号
”的前面,作为延长。
而且版本号都是递增的,在雷同的位上递增、或者更高位递增,比方:’1.2.5.1′ => ‘1.2.5.2’、’1.2.5.1′ => ‘1.2.6.1’、’1.9.9.9′ => ‘2.0.0.0’。
更具体的版本解释请看这里 语义化版本 2.0.0。
比拟办法
这样咱们能够做版本号比拟,这里提供一个咱们我的项目中应用的办法,反对任意版本号位数的比拟哦,比方 3 位的、4 位的。
// 3 位
Major_Version_Number.Minor_Version_Number[.Revision_Number]
主版本号 . 子版本号 [. 修改版本号]
// 4 位
Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]
主版本号 . 子版本号 [. 修改版本号 [. 编译版本号]]
之所以反对任意版本号位数的比拟,是因为版本号都是递增的,而以下的办法是从左到右,一位一位的比拟的。
js 代码:
/**
* 版本比拟 VersionCompare
* @param {String} curVersion 以后版本
* @param {String} supportVersion 比拟版本
* @return {Boolean} false 以后版本小于比拟版本返回 true
*/
const versionCompare = (curVersion, supportVersion) => {if (!curVersion) {return false;}
if (!supportVersion) {return false;}
// 相等 也是比拟要害的一步
if (curVersion === supportVersion) {return true;}
const curArr = curVersion.split('.');
const supportArr = supportVersion.split('.');
for (let i = 0; i < curArr.length; i += 1) {
// 只有当两个版本号不相等才比拟
if (+curArr[i] !== +supportArr[i]) {
// 间接返回 后果,停止循环
return +curArr[i] > +supportArr[i];
}
}
return false;
};
应用也很简略:
js 代码:
// 3 位比拟
versionCompare('1.3.3', '1.2.5'); // true
versionCompare('1.1.3', '1.2.5'); // false
versionCompare('1.2.5', '1.2.5'); // true
// 4 位比拟
versionCompare('1.2.5.1', '1.2.5.1'); // true
versionCompare('1.2.3.4', '1.2.3.5'); // false
versionCompare('1.2.3.6', '1.2.3.5'); // true
versionCompare('1.3.3.4', '1.2.3.5'); // true
// 单 位上大于 10 的位进行比拟
versionCompare('1.2.15.1', '1.2.5.1'); // true
versionCompare('1.2.15.1', '1.2.16.1'); // false
这里须要留神的是依据我本人的业务逻辑 以后版本小于比拟版本返回 false,以后版本等于比拟版本返回 true。
你能够依据本人的业务逻辑批改代码。
最初
有一段时间没写技术文章了啊 ???? 切实羞愧。
下一篇原创应该是本人的年终总结了,往年的年初要比今年来得更晚一些,今年的年终总结都是 12 月下询就写好了的。
没方法,往年的 12 月份确实很忙,还没排上期,2020 的年终总结,会有 2021 年 1 月写好 ????。
不过今年的年终总结能够先看一下:
- 我的 2019 年 – 当勤精进,但念无常,何以解忧,唯有暴富
- 2018 年,我的本命年
- 前端工程师的 2019 年年终总结 – 真香篇