语义化版本规范

Releases 是指软件或项目的正式发布版本,在浏览一些开源仓库时,可以看到当前项目最新版本和历史版本

仔细研究就会发现,版本号不是以固定值递增的,有时候第三位加 1,有时候加 2,有时候直接把第一位加 1,后两位置 0。这些版本变化规律是什么,能否从版本号看出与上一个版本的差异?

这就引出了语义化版本规范

什么是语义化版本规范?

语义化版本规范(Semantic Versioning,缩写为 SemVer)是一种版本号的标识规范,它规定了版本号的表示、增加和比较方式,以及不同版本号代表的含义。SemVer 的出现,主要是为了解决因版本更新带来的包依赖问题

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

在依赖高的系统中发布新版本包可能很快会成为噩梦。如果依赖关系过高,可能面临版本控制被锁死的风险(必须对每一个依赖包改版才能完成某次升级)。而如

果依赖关系过于松散,又将无法避免版本的混乱(假设兼容于未来的多个版本已超出了合理数量)

当你项目的进展因为版本依赖被锁死或版本混乱变得不够简便和可靠,就意味着你正处于依赖地狱之中

通过 SemVer 来约束版本号的配置和增长,就可以通过版本号来向别人说明你的修改。别人在引用包时,就可以清楚的了解到版本之间的差异和兼容性情况,从而选用合适版本的包

简单来说:语义化版本规范就是一套约定俗成的规则,通过这个规则,可以清晰的看出不同版本之间的差异、兼容性,有助于解决软件包依赖和升级过程中的问题

语义化版本的格式

语义化版本格式为:主版本号.次版本号.修订号(X.Y.Z),其中 X、Y 和 Z 为非负的整数,且禁止在数字前方补零

版本号递增规则如下:

主版本号:当你做了不兼容的 API 修改

次版本号:当你做了向下兼容的功能性新增,这里有个不成文的约定,偶数为稳定版本、奇数为开发版本

修订号:当你做了向下兼容的问题修正

例如,V3.12.0 中,3 是主版本号、12 是次版本号、0 是修订号

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

常见的先行版本号有:

  • Snapshot:快照,也被称为开发版,处于开发阶段。这个版本的代码禁止用于生产环境

  • Alpha (α):内测版,内部交流或专业测试人员测试使用

  • Preview:预览版,与 Alpha 类似,有时还会细分 M1,M2 版本

  • Beta (β):公测版,专业爱好者大规模测试使用,存在一些 Bug,不适合一般用户使用

  • Gamma (λ):比较成熟的测试版

  • RC (Release Candidate):候选版本,处于 Gamma 阶段,该版本已经完成了全部功能并清除了大量的 Bug。 到了这个阶段,只会修复 Bug,不会对软件做任何大的更改。一般来说,Alpha -> Beta -> Gamma 是迭代的关系,RC1 -> RC2 是取舍的关系

  • Release:发行版本,正式发行的版本,已经经过测试,一般不会出现严重的 Bug,适合一般用户使用。对于不开源的软件, Release 可能是带有免费使用时间限制的版本

  • Stable:稳定版,同 Release 版本

举个例子,现在版本号为 V3.12.0-alpha.1,按照上面先行版本号的说明,可以看出这是一个内测版的项目,适合于内部交流或专业测试人员测试使用,生产环境中不推荐下载这个版本

语义化版本的规范

语义化版本控制规范比较多,介绍几个比较重要的:

  • 使用语义化版本控制的软件必须定义公共 API。该 API 可以在代码中被定义或出现于严谨的文档内。无论何种形式都应该力求精确且完整

  • 标记版本号的软件发行后,禁止改变该版本软件的内容,任何修改都必须以新版本发行、

  • 主版本号为零(0.y.z)的软件处于开发初始阶段,一切都可能随时被改变。这样的公共 API 不应该被视为稳定版

  • 1.0.0 的版本号用于界定公共 API 的形成。这一版本之后所有的版本号更新都基于公共 API 及其修改内容

  • 修订号 Z(x.y.Z | x > 0)必须在只做了向下兼容的修正时才递增,这里的修正其实就是 Bug 修复

  • 次版本号 Y(x.Y.z | x > 0)必须在有向下兼容的新功能出现时递增,在任何公共 API 的功能被标记为弃用时也必须递增,当有改进时也可以递增。其中可以包括修订级别的改变。每当次版本号递增时,修订号必须归零

  • 主版本号 X(X.y.z | X > 0)必须在有任何不兼容的修改被加入公共 API 时递增。其中可以包括次版本号及修订级别的改变。每当主版本号递增时,次版本号和修订号必须归零

总结

了解了语义化版本规范后,可以更好的看明白一个项目的迭代过程、轻松的在项目中指定依赖项的版本

最后看一个应用场景:

假设有个名为“救火车”的函数库,它需要另一个名为“梯子”并已经有使用语义化版本控制的包。当救火车创建时,梯子的版本号为 3.1.0。因为救火车使用了一

些版本 3.1.0 所新增的功能,你可以放心地指定依赖于梯子的版本号大于等于 3.1.0 但小于 4.0.0。这样,当梯子版本 3.1.1 和 3.2.0 发布时,你可

以将直接它们纳入你的包管理系统,因为它们能与原有依赖的软件兼容

参考:语义化版本 2.0.0 | Semantic Versioning (semver.org)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】String的介绍与应用详解

大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪&#x1f4aa…

操作系统总结(2)

目录 2.1 进程的概念、组成、特征 (1)知识总览 (2)进程的概念 (3)进程的组成—PCB (4)进程的组成---程序段和数据段 (5)程序是如何运行的呢&#xff1f…

《中国企业报》集团数字产业发展研究院介绍

《中国企业报》集团数字产业发展研究院(以下简称“中企数研院”),隶属于《中国企业报》集团管理。“中企数研院”致力于“数字经济产业化发展战略”大背景下,以“县域数字经济”、“企业数字化转型”及“数字人民币”推广等发展方…

串口服务器在工业控制领域的应用:深度解析与前沿实践

在工业控制领域,随着技术的不断发展,传统的串口通信方式已经难以满足现代工业系统对高效、稳定、安全通信的需求。此时,串口服务器作为一种先进的通信技术解决方案,正在逐步改变工业控制领域的通信格局。本文将深度解析串口服务器…

Timeline

SignalTrack信号轨道和自定义带参数的Marker信号和轨道 MySignalReceiver using System; using System.ComponentModel; using UnityEngine.Playables; using UnityEngine.Events;namespace UnityEngine.Timeline { public class BaseSignalReceiver<T, Q> : MonoBeha…

炫酷网页设计:HTML5 + CSS3打造8种心形特效

你以为520过去了&#xff0c;你就逃过一劫了&#xff1f;那不是还有分手呢&#xff0c;那不是还得再找对象呢&#xff0c;那不是还有七夕节呢&#xff0c;那不是还有纪念日呢&#xff0c;那不是还有各种各样的节日呢&#xff0c;所以呀&#xff0c;这8种HTML5 CSS3打造8种心形…

Python100个库分享第23个—wordcloud(词云图)

目录 专栏导读库的介绍库的安装基础使用1&#xff1a;将TXT文本转为词云图基础使用2&#xff1a;使用自定义字体和形状基础使用3&#xff1a;中文词云图停用词(中英文版)-代码是中文版总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0…

SAP---成本中心采购跟消耗性采购的区别

1.常规库存采购业务的说明&#xff1a; 1.从业务层面分析&#xff0c;企业的常规库存物料采购是&#xff1a; 采购部门下采购订单后&#xff0c;供应商送货&#xff0c;当货物到厂后&#xff0c;由库管员执行收货操作&#xff0c;先将货物收到仓库中&#xff0c;再由各个需求…

10个企业用的wordpress中文模板

移民wordpress主题 移民代办wordpress主题&#xff0c;适合做海外移民咨询的代理公司搭建wordpress企业官方网站使用。 https://www.jianzhanpress.com/?p5130 模特演出wordpress主题 暗黑风格的wordpress主题模板&#xff0c;适用于模特演出公司或艺人经纪公司搭建wordpre…

YOLOv8原理详解

Yolov8是2023年1月份开源的。与yolov5一样&#xff0c;支持目标检测、分类、分割任务。 Yolov8主要改进之处有以下几个方面&#xff1a; Backbone&#xff1a;依旧采用的CSP的思想&#xff0c;不过将Yolov5中的C3模块替换为C2F模块&#xff0c;进一步降低了参数量&#xff0c…

指针数组与数组指针的理解

typedef struct vexnode {int key;struct arcnode *next; }vexnode, adjlist[MVNUM]; void init(adjlist *list); void init(adjlist *list) {for(size_t i 0; i < MVNUM; i){list[i].key i;list[i].next NULL;} }上述代码编译的时候没有报错&#xff0c;但是运行的时候&…

RabbitMQ 交换机类型

常用交换机 发布订阅&#xff08;Publish/Subscribe&#xff09;交换机 一个生产者给多个队列发送消息&#xff0c;X 代表交换机。 交换机的作用&#xff1a;类似网络路由器&#xff0c;主要提供转发功能&#xff0c;解决怎么把消息转发到不同的队列中&#xff0c;让消费者从不…

第十八篇:探索非关系型数据库:从入门到实践

探索非关系型数据库&#xff1a;从入门到实践 1. 引言 1.1 非关系型数据库的崛起&#xff1a;背景与重要性 在过去的几十年里&#xff0c;关系型数据库&#xff08;RDBMS&#xff09;一直在数据存储和管理领域占据主导地位。其严谨的结构化数据模型以及强大的事务处理能力&am…

Mysql触发器优化大数据表

背景 数据库的订单数量过多&#xff0c;需要分出热表用于快速查询&#xff0c;热表仅保存10天的订单数据。 解决思路 每次数据库订单表触发增删改时&#xff0c;同步操作到trigger_order_mul_info表&#xff0c;然后trigger_order_mul_info会定期删除超过10天的数据。 增删…

家政项目day1 配置说明前端

目录 1.配置1.1 开发环境1.2 配置虚拟机1.3 编写nacos配置中心1.4 配置OSS存储1.5 配置高德地图api 2 设计前端并且进行部署2.1 开发环境2.2 安装类库2.3 修改代码2.4 试运行前端2.4.1 OSS配置验证 1.配置 1.1 开发环境 由于个人资金问题&#xff0c;可能担负不起8h8g的服务器…

React-JSX基础

什么是JSX 概念&#xff1a;JSX是JavaScript和XML&#xff08;HTML&#xff09;的缩写&#xff0c;表示在JS代码中编写HTML模板结构&#xff0c;它是React中编写UI模板的方式 优势&#xff1a;1.HTML的声明式模板写法 2.JS的可编程能力 JSX的本质 JSX并不是标准的JS语法&…

学习现货黄金分析技术前 有3点注意

投资者要做现货黄金交易&#xff0c;就需要懂得分析技术&#xff0c;通过分析投资者能找到市场的交易机会。其实分析也是对现货黄金市场进行思考的过程&#xff0c;未经分析而得到的入场机会&#xff0c;失败的可能性是较大的。但是我们在学习现货黄金分析技术之前&#xff0c;…

在做题在学习(60):和可被K整除的子数组

974. 和可被 K 整除的子数组 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;前缀和 哈希表 同余定理 同余定理&#xff1a; 而此题要求返回能被k整除(%k 0)的子数组的个数&#xff0c;如下图&#xff1a; 把问题转化为——> 有多少个前缀和的余数 sum%k &a…

D60SB60-ASEMI整流桥D60SB60参数、封装、尺寸

编辑&#xff1a;ll D60SB60-ASEMI整流桥D60SB60参数、封装、尺寸 型号&#xff1a;D60SB60 品牌&#xff1a;ASEMI 封装&#xff1a;D-SB 批号&#xff1a;2024 特性&#xff1a;插件、整流桥 平均正向整流电流&#xff08;Id&#xff09;&#xff1a;60A 最大反向击穿…

C++---运算符重载

运算符重载介绍 在类中重新定义运算符&#xff0c;赋予运算符新的功能以适应类的运算&#xff0c;就称为运算符重载。 运算符重载是一种形式的C多态,它使得对象操作更直观,本质上也是属于函数重载。 实际上&#xff0c;我们已经在不知不觉之中使用了运算符重载。例如&#xff…