风君子博客

  • 首页
  • 业界
  • 前端
  • 运维
  • 建站
  • 软件
  • 生活
  • 后端
  • 创投
  • 运营
  • 程序人生
    • 影视
    • 游戏
    • 句子
    • bootstrap4教程
    • 资源
    • 日期计算器
  • 其他
    • 说说
    • 关于本站
  1. 首页
  2. 前端
  3. 正文

语义化版本控制规范简述

2018年9月23日 638点热度 0人点赞 0条评论

摘要

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

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

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

简介

在软件管理的领域里存在着被称作“依赖地狱”的死亡之谷,系统规模越大,加入的套件越多,你就越有可能在未来的某一天发现自己已深陷绝望之中。

在依赖高的系统中发布新版本套件可能很快会成为恶梦。如果依赖关系过高,可能面临版本控制被锁死的风险(必须对每一个相依套件改版才能完成某次升级)。而如果依赖关系过于松散,又将无法避免版本的混乱(假设兼容于未来的多个版本已超出了合理数量)。当你专案的进展因为版本相依被锁死或版本混乱变得不够简便和可靠,就意味着你正处于依赖地狱之中。

作为这个问题的解决方案之一,我提议用一组简单的规则及条件来约束版本号的配置和增长。这些规则是根据(但不局限于)已经被各种封闭、开放源码软件所广泛使用的惯例所设计。为了让这套理论运作,你必须先有定义好的公共API。这可以透过文件定义或代码强制要求来实现。无论如何,这套API 的清楚明了是十分重要的。一旦你定义了公共API,你就可以透过修改相应的版本号来向大家说明你的修改。考虑使用这样的版本号格式:XYZ (主版本号.次版本号.修订号)修复问题但不影响API 时,递增修订号;API 保持向下兼容的新增及修改时,递增次版本号;进行不向下兼容的修改时,递增主版本号。

我称这套系统为“语义化的版本控制”,在这套约定下,版本号及其更新方式包含了相邻版本间的底层代码和修改内容的信息。

语义化版本控制规范(SemVer)

以下关键词MUST、MUST NOT、REQUIRED、SHALL、SHALL NOT、SHOULD、SHOULD NOT、 RECOMMENDED、MAY、OPTIONAL 依照RFC 2119 的叙述解读。(译注:为了保持语句顺畅, 以下文件遇到的关键词将依照整句语义进行翻译,在此先不进行个别翻译。)

  1. 使用语义化版本控制的软件“必须MUST”定义公共API。该API可以在代码中被定义或出现于严谨的文件内。无论何种形式都应该力求精确且完整。
  2. 标准的版本号“必须MUST”采用XYZ的格式,​​ 其中X、Y和Z为非负的整数,且“禁止MUST NOT”在数字前方补零。X是主版本号、Y是次版本号、而Z为修订号。每个元素“必须MUST”以数值来递增。例如:1.9.1 -> 1.10.0 -> 1.11.0。
  3. 标记版本号的软件发行后,“禁止MUST NOT”改变该版本软件的内容。任何修改都“必须MUST”以新版本发行。
  4. 主版本号为零(0.yz)的软件处于开发初始阶段,一切都可能随时被改变。这样的公共API 不应该被视为稳定版。
  5. 1.0.0 的版本号用于界定公共API 的形成。这一版本之后所有的版本号更新都基于公共API 及其修改内容。
  6. 修订号Z(xyZ | x > 0)“必须MUST”在只做了向下兼容的修正时才递增。这里的修正指的是针对不正确结果而进行的内部修改。
  7. 次版本号Y(xYz | x > 0)“必须MUST”在有向下兼容的新功能出现时递增。在任何公共API的功能被标记为弃用时也“必须MUST”递增。也“可以MAY”在内部程序有大量新功能或改进被加入时递增,其中“可以MAY”包括修订级别的改变。每当次版本号递增时,修订号“必须MUST”归零。
  8. 主版本号X(Xyz | X > 0)“必须MUST”在有任何不兼容的修改被加入公共API时递增。其中“可以MAY”包括次版本号及修订级别的改变。每当主版本号递增时,次版本号和修订号“必须MUST”归零。
  9. 先行版本号“可以MAY”被标注在修订版之后,先加上一个连接号再加上一连串以句点分隔的标识符号来修饰。标识符号“必须MUST”由ASCII码的英数字和连接号[0-9A-Za-z-]组成,且“禁止MUST NOT”留白。数字型的标识符号“禁止MUST NOT”在前方补零。先行版的优先级低于相关联的标准版本。被标上先行版本号则表示这个版本并非稳定而且可能无法达到兼容的需求。范例:1.0​​.0-alpha、1.0.0-alpha.1、 1.0.0-0.3.7、1.0.0-x.7.z.92。
  10. 版本编译信息“可以MAY”被标注在修订版或先行版本号之后,先加上一个加号再加上一连串以句点分隔的标识符号来修饰。标识符号“必须MUST”由ASCII的英数字和连接号[0-9A-Za-z-]组成,且“禁止MUST NOT”留白。当判断版本的优先层级时,版本编译信息“可SHOULD”被忽略。因此当两个版本只有在版本编译信息有差别时,属于相同的优先层级。范例:1.0.0-alpha+001、1.0.0+20130313144700、 1.0.0-beta+exp.sha.5114f85。
  11. 版本的优先层级指的是不同版本在排序时如何比较。判断优先层级时,“必须MUST”把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较(版本编译信息不在这份比较的列表中)。由左到右依序比较每个标识符号,第一个差异值用来决定优先层级:主版本号、次版本号及修订号以数值比较,例如1.0.0 < 2.0.0 < 2.1.0 < 2.1.1。当主版本号、次版本号及修订号都相同时,改以优先层级比较低的先行版本号决定。例如:1.0.0-alpha < 1.0.0。有相同主版本号、次版本号及修订号的两个先行版本号,其优先层级“必须MUST”透过由左到右的每个被句点分隔的标识符号来比较,直到找到一个差异值后决定:只有数字的标识符号以数值高低比较,有字母或连接号时则逐字以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。

为什么要使用语义化的版本控制?

这并不是一个新的或者革命性的想法。实际上,你可能已经在做一些近似的事情了。问题在于只是“近似”还不够。如果没有某个正式的规范可循,版本号对于依赖的管理并无实质意义。将上述的想法命名并给予清楚的定义,让你对软件使用者传达意向变得容易。一旦这些意向变得清楚,弹性(但又不会太弹性)的依赖规范就能达成。

举个简单的例子就可以展示语义化的版本控制如何让依赖地狱成为过去。假设有个名为“救火车”的函式库,它需要另一个名为“梯子”并已经有使用语义化版本控制的套件。当救火车创建时,梯子的版本号为3.1.0。因为救火车使用了一些版本3.1.0 所新增的功能, 你可以放心地指定相依于梯子的版本号大等于3.1.0 但小于4.0.0。这样,当梯子版本3.1.1 和3.2.0 发布时,你可以将直接它们纳入你的套件管理系统,因为它们能与原有相依的软件兼容。

作为一位负责任的开发者,你理当确保每次套件升级的运作与版本号的表述一致。现实世界是复杂的,我们除了提高警觉外能做的不多。你所能做的就是让语义化的版本控制为你提供一个健全的方式来发行以及升级套件,而无需推出新的相依套件,节省你的时间及烦恼。

如果你对此认同,希望立即开始使用语义化版本控制,你只需声明你的函式库正在使用它并遵循这些规则就可以了。请在你的README 文件中保留此页连结,让别人也知道这些规则并从中受益。

参考资料

  • Semantic Versioning 2.0.0
  • 本文转自:http://caibaojian.com/a-programmer/programmer-basic/semantic-versioning.html
标签: 语义化版本
最后更新:2019年6月6日

风君子

独自遨游何稽首 揭天掀地慰生平

点赞
< 上一篇
下一篇 >

猜你喜欢

文章评论

取消回复

风君子

独自遨游何稽首 揭天掀地慰生平

最新 热点 随机
最新 热点 随机
理想汽车第二季度营收87.3亿元,净亏损6.41亿元 阅文集团2022年上半年营收40.87亿元 同比下滑5.9% 斗鱼Q2营收18亿元同比下滑21.6% 调整后净利润2360万元同比扭亏 UltralSO制作启动盘时报错:磁盘/映像容量太小 U盘安装centOS遇到dracut-initqueue timeout问题解决办法 抖音怎么设置心情状态 抖音心情怎么设置 抖音心情怎么取消 抖音心情怎么关闭 抖音心情状态显示怎么设置
信用卡审核久是不是代表通过不了 这可不一定工行孩子王baby年费可以免吗?得看你消费能力够不够信用卡透支额度是什么 要怎么计算工行星级评定标准 这些知识你必须掌握统信 UOS 宣布成为国内首个 50 万 + 操作系统生态适配组合索尼宣布《如龙》系列 8 款游戏将于今年年内加入 PS+ 会员游戏库建行龙卡喜马拉雅fm信用卡制卡要多久?阿里云盘 iOS 版 3.9.0 更新:新增共享相簿,新版传图识字,iPad 支持扫码登录联想晒拯救者 Y70 手机背面照:7.99mm 轻薄机身,CNC 金属中框罗技宣布与腾讯合作,年内推出云游戏掌机
支付宝怎么定时转账 蚂蚁庄园12月12日答案最新 红魔5S游戏手机配备双游戏肩键 或配骁龙865 Plus 魔兽世界8.0戈霍恩技能机制及打法攻略 中国仅三成网民月收入在5000元以上:还有个更惊人的数字 雷蛇发布《光环:无限》联名套件:键鼠、耳机、桌垫四件套 分析师:到 2028 年,电动汽车将占全球汽车销量的 33% 谷歌相册福利终止!照片无限存储功能明年停用:每人仅提供15GB 辐射4银衣怪客任务无法触发的解决方法 征信逾期记录多久消除
标签聚合
三星 电动汽车 IT资讯 iphone 贷款 秘籍 利息 小米 马斯克 支付宝 科技 苹果 美国 额度 芯片 微软 银行卡 手机 特斯拉 腾讯 理财知识 银行 借款人 投资理财 京东 信用卡 快科技 汽车 华为 股票
注意事项 病虫 办法 品种 常见 水培 新买 家庭 处理 怎么 作文 什么时候 家里 回事 阳台 大全 原因 作用 什么 冬天 叶子发黄 防治 区别 适合 发黄 盆景 吊兰 虫害 有哪些 开花 栀子花 养花 植物 老舍 时间 君子兰 治方 图片 功效 绿萝 叶子 兰花 肥料 室内 怎么办 盆栽 烂根 方法 多久 花语
Tags
酒 胡萝卜 食物 私房菜 有什么好处 水果 能吃 鸡蛋 身体 会胖吗 副作用 吃什么 相克 好处 饮食 作用 土豆食谱 方法 牛肉 豆腐 糖 热量 茄子 好吃 营养 皮肤过敏 区别 菜谱 牛肉食谱 功效 怎么做 营养价值 豆腐食谱 维生素 土豆 热菜 食用方法 常吃 健康 排骨 汤类 高血压 牛奶 糖尿病人 做法 吃法 下饭菜 海鲜 一起吃 排骨食谱
最近评论
youyou 发布于 2 周前(07月30日) 站长,文章底部相关文章使用的是哪款插件,方便提供下吗,可发邮箱,谢谢!
youyou 发布于 2 周前(07月30日) 你好,咨询下你的文章后面的相关文章采用的是哪个插件,谢谢!
www 发布于 4 周前(07月19日) 听!我知道你们不会相信这一点,但我得到了这个 Minecraft 升级代码并且它被赎回了!你也可以从...
鲜盖 发布于 2 个月前(06月24日) 感谢你的博客页!完美解决了困扰我的滚动条问题!
仍搜 发布于 2 个月前(06月07日) 你好换个友情链接吧
九九 发布于 3 个月前(05月06日) 也可能是 IP2LOCATION 数据
风君子 发布于 8 个月前(12月20日) 直播这么赚钱的吗?
wanif 发布于 8 个月前(12月18日) 采用你提供的pe制作u盘后无法识别mac硬盘,如何解决?
robotunl 发布于 8 个月前(12月18日) 可以用了,感谢
robotunl 发布于 8 个月前(12月17日) DISM++链接下不了了啊,能再发一个么。 还有怎么制作和博主一样的PE u盘。

COPYRIGHT © 2022 风君子博客 ALL RIGHTS RESERVED.

豫ICP备14018241号