什么是语义化版本?

简介: 最近在对项目的版本号做优化,因此重新学习了一下语义化版本的知识。

最近在对项目的版本号做优化,因此重新学习了一下语义化版本的知识.

一、语义化版本的概念

语义化版本的英文是:Semantic Versioning。

它是由 Gravatars 创办者兼 GitHub 共同创办者 Tom Preston-Werner 所建立的一个有关如何命名软件和库(包)版本的规范,用以解决在大型项目中对依赖的版本失去控制的问题(例如你可能因为害怕不兼容而不敢去更新依赖)。

现在 Semantic Versioning 已经在开源社区中得到了广泛的认同,Node.js 的包管理工具 npm 也完全基于 Semantic Versioning 来管理依赖的版本。

而 SemVer 是语义化版本的一个具体实现,目前是由 npm 的团队维护的,实现了版本和版本范围的解析、计算、比较。

SemVer 的 Github 地址:semver

二、SemVer 的版本格式

版本格式:主版本号.次版本号.修订号(MAJOR.MINOR.PATCH),版本号递增规则如下:

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

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

三、SemVer 的规范

以下关键词 MUST、MUST NOT、REQUIRED、SHALL、SHALL NOT、SHOULD、SHOULD NOT、 RECOMMENDED、MAY、OPTIONAL 依照 RFC 2119 的叙述解读。

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

2.标准的版本号必须(MUST)采用 X.Y.Z 的格式,其中 X、Y 和 Z 为非负的整数,且禁止(MUST NOT)在数字前方补零。X 是主版本号、Y 是次版本号、而 Z 为修订号。每个元素必须(MUST)以数值来递增。例如:1.9.1 -> 1.10.0 -> 1.11.0。

3.标记版本号的软件发行后,禁止(MUST NOT)改变该版本软件的内容。任何修改都必须(MUST)以新版本发行。

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

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

6.修订号 Z(x.y.Z | x > 0)必须(MUST)在只做了向下兼容的修正时才递增。这里的修正指的是针对不正确结果而进行的内部修改。

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

8.主版本号 X(X.y.z | 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。

相关文章
|
JSON 前端开发 数据格式
全面拥抱FastApi —优雅的返回异常错误
全面拥抱FastApi —优雅的返回异常错误
|
8月前
|
人工智能 数据可视化 Java
AI智能体的开发方法
本文系统梳理国内AI智能体开发全景:从“感知-决策-行动-记忆”认知闭环架构出发,对比Dify、Coze等低代码平台与LangGraph、AgentScope、Eino、Spring AI Alibaba等编程级框架;解析MCP协议、RAG技术栈等基础设施;并按MVP、企业级、极客定制三类场景给出选型建议。(239字)
|
存储 SQL 运维
《告别日志混乱!巧用rsyslog与journald优化系统日志管理》
系统日志是服务器运行状况的“黑匣子”,对运维至关重要。rsyslog与journald作为两大日志管理工具,各具特色:rsyslog功能强大,支持本地及远程日志处理与转发;journald采用二进制存储,支持结构化数据和元数据,提升查询效率。两者协作可实现日志的高效收集、分类与分析,优化系统监控与故障排查。掌握它们的配置与使用,能显著提升服务器运维效率,保障系统稳定运行。
598 19
|
7月前
|
弹性计算 安全 Linux
2026阿里云建站教程:从购买ECS到部署PageAdmin CMS,完整步骤+踩坑记录
本文分享 2026 年阿里云搭建 PageAdmin 网站全流程,含购服务器、域名、备案、部署步骤,总花费 134 元耗时约 15 天,并总结 5 个常见问题及解决办法。
1092 1
|
7月前
|
Windows
如何完美地卸载流氓软件?软件卸载不掉也安装不了怎么办?
HiBit Uninstaller 是一款轻量级、便携式Windows卸载工具,支持彻底删除软件及残留文件、注册表项,并提供系统垃圾清理、右键菜单管理等优化功能,操作简单,免安装即用。(239字)
1523 6
|
7月前
|
传感器 机器学习/深度学习 算法
基于MATLAB的复杂环境移动机器人路径规划算法研究
针对复杂环境下移动机器人的路径规划问题,本文研究了全局路径规划(A*算法、Dijkstra算法)与局部路径规划(动态窗口法DWA、人工势场法APF)的经典算法,并结合MATLAB仿真平台实现了算法验证与性能对比。通过构建栅格地图与动态障碍物环境,分析了不同算法的路径长度、计算时间、避障能力等性能指标,提出了一种混合路径规划策略(全局A*+局部DWA),有效提升了机器人在复杂环境下的路径安全性与实时性。实验结果表明,混合策略在路径长度与避障成功率上优于单一算法,为复杂环境机器人导航提供了可行方案。
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
2103 1
Python API接口实战指南:从入门到精通
|
9月前
|
存储 弹性计算 Linux
2026年阿里云服务器新手操作手册:配置选型、环境搭建与运维管理指南
在数字化业务部署中,云服务器凭借弹性扩展、成本可控的优势,已成为个人开发者与企业搭建网站、运行应用的核心选择。阿里云 ECS(弹性计算服务)作为国内主流云服务产品,地域节点丰富、配置灵活,但新手常因不熟悉购买路径与参数选择陷入困惑。本文从购买前准备、核心购买方式、配置选择要点到控制台基础操作,系统梳理新手所需的全流程知识,助力高效完成上云部署。
|
11月前
|
数据采集 存储 监控
避开 Playwright 常见坑,让你的 UI 测试跑得又快又稳
本文总结 Playwright 自动化测试12大常见坑点及解决方案,涵盖测试组织、定位策略、等待机制、数据准备、Mock、并发优化等,结合实战案例提升测试稳定性与效率,助力 CI 流水线高效可靠。
Python-素数
本文介绍了如何使用 Python 判断素数,并通过具体示例展示了求 100 以内及自定义范围内所有素数的方法。内容包括素数的定义、判断素数的底层逻辑和步骤,以及详细的代码演示。适合初学者参考学习。

热门文章

最新文章