Semver(语义化版本号)扫盲
最近Github 10周年在朋友圈里沸沸扬扬刷屏,小编在工作中却惊讶的发现不少同事对版本号中的beta和rc没有概念,使用npm install package@next时,也不清楚next代表的含义。于是,决定写一篇文章科普一下由 Github 起草的Semver(语义化版本)的相关知识。
实际案例
首先,我们来看看目前最流行的前端框架之一的React最近5个月的版本发布日志,截图来自npmjs.com:
从上图,我们不难得出几个结论:
- 软件的版本通常由三位组成,形如:X.Y.Z
- 版本是严格递增的,此处是:16.2.0 -> 16.3.0 -> 16.3.1
- 在发布重要版本时,可以发布alpha, rc等先行版本
- alpha和rc等修饰版本的关键字后面可以带上次数和meta信息
可以说,React 发布版本时做的相当到位,版本给人的感觉非常清晰,也很严谨。这得益于 Semver(语义化版本) 规范的功劳。那么,Semver是在什么场景下出现的呢?它的出现又解决了什么问题?这里要和大家科普下“依赖地狱”的概念。
依赖地狱
通俗而言,“依赖地狱”指开发者安装某个软件包时,发现这个软件包里又依赖不同特定版本的其它软件包。随着系统功能越来越复杂,依赖的软件包越来越多,依赖关系也越来越深,这个时候可能面临版本控制被锁死的风险。
因此,Github 起草了一个具有指导意义的,统一的版本号表示规则,称为 Semantic Versioning(语义化版本表示)。该规则规定了版本号如何表示,如何增加,如何进行比较,不同的版本号意味着什么。
官网:https://semver.org/ 中文版:https://semver.org/lang/zh-CN/
下面是遵从了Semver规范的React依赖图,截图来自npm.broofa.com:
可以看出,遵从了Semver规范的包依赖非常清晰,没有出现循环依赖、依赖冲突等常见问题。
版本格式
版本格式:主版本号.次版本号.修订号,版本号递增规则如下:
- 主版本号(major):当你做了不兼容的 API 修改,
- 次版本号(minor):当你做了向下兼容的功能性新增,可以理解为Feature版本,
- 修订号(patch):当你做了向下兼容的问题修正,可以理解为Bug fix版本。
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。
先行版本
当要发布大版本或者核心的Feature时,但是又不能保证这个版本的功能 100% 正常。这个时候就需要通过发布先行版本。比较常见的先行版本包括:内测版、灰度版本了和RC版本。Semver规范中使用alpha、beta、rc(以前叫做gama)来修饰即将要发布的版本。它们的含义是:
- alpha: 内部版本
- beta: 公测版本
- rc: 即Release candiate,正式版本的候选版本
比如:1.0.0-alpha.0, 1.0.0-alpha.1, 1.0.0-beta.0, 1.0.0-rc.0, 1.0.p-rc.1 等版本。alpha, beta, rc后需要带上次数信息。
版本发布准则
列举出比较实用的一些规则:
- 标准的版本号必须采用XYZ的格式,并且X、Y 和 Z 为非负的整数,禁止在数字前方补零,版本发布需要严格递增。例如:1.9.1 -> 1.10.0 -> 1.11.0。
- 某个软件版本发行后,任何修改都必须以新版本发行。
- 1.0.0 的版本号用于界定公共 API。当你的软件发布到了正式环境,或者有稳定的API时,就可以发布1.0.0版本了。
- 版本的优先层级指的是不同版本在排序时如何比较。判断优先层级时,必须把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较。
npm包依赖
当执行npm install package -S 来安装三方包时,npm 会首先安装包的最新版本,然后将包名及版本号写入到 package.json 文件中。
比如,通过npm 安装 react 时:
{"dependencies": {"react": "~16.2.0"}
}
项目对包的依赖可以使用下面的 3 种方法来表示(假设当前版本号是 16.2.0):
- 兼容模块新发布的补丁版本:~16.2.0、16.2.x、16.2
- 兼容模块新发布的小版本、补丁版本:^16.2.0、16.x、16
- 兼容模块新发布的大版本、小版本、补丁版本:*、x
npm包发布
通常我们发布一个包到npm仓库时,我们的做法是先修改 package.json 为某个版本,然后执行 npm publish 命令。手动修改版本号的做法建立在你对Semver规范特别熟悉的基础之上,否则可能会造成版本混乱。npm 考虑到了这点,它提供了相关的命令来让我们更好的遵从Semver规范:
- 升级补丁版本号:npm version patch
- 升级小版本号:npm version minor
- 升级大版本号:npm version major
当执行 npm publish 时,会首先将当前版本发布到 npm registry,然后更新 dist-tags.latest 的值为新版本。
当执行 npm publish --tag=next 时,会首先将当前版本发布到 npm registry,并且更新 dist-tags.next 的值为新版本。这里的 next 可以是任意有意义的命名(比如:v1.x、v2.x 等等)
OK,现在你应该知道 npm install package@next时next代表的含义了吧!
团队开源
腾讯IVWEB团队的工程化解决方案feflow已经开源
- Github主页:https://github.com/feflow/feflow
- 官网:http://www.feflowjs.org/
如果对您的团队或者项目有帮助,请给个Star支持一下哈~
Semver(语义化版本号)扫盲相关推荐
- Semver(语义化版本号)扫盲 1
前言 最近在处理创建指定版本的 react native 项目的时候,由于自己的粗心大意,命令写成了这样:react-native init demo --version0.47.2 创建的一直是最新 ...
- Semver语义化版本号和npm包之semver的相关使用
依赖地狱 通俗而言,"依赖地狱"指开发者安装某个软件包时,发现这个软件包里又依赖不同特定版本的其它软件包.随着系统功能越来越复杂,依赖的软件包越来越多,依赖关系也越来越深,这个时候 ...
- semver语义化版本号
semver语义化版本号 语义化版本号各位置的含义 更详细的介绍,见简书的这篇日志 版本号:X.Y.Z X: 代表发生了不兼容的API改变 Y: 代表向后兼容的功能性变化 Z: 代表向后兼容bug f ...
- npm包 semver模块【语义化版本号】
npm包 semver模块 Semver 简介 (Semantic Versioning) Semver 实际案例 ---------------------------------------- 一 ...
- 语义化版本号规范(SemVer)
概念 语义化的版本控制(Semantic Versioning),简称语义化版本,英文缩写为 SemVer. 语义化版本通过一组简单的规则及条件来约束版本号的配置和增长.这些规则是根据(但不局限于)已 ...
- Go (Golang) 工具之自动化版本工具 gsemver | semver 语义化版本规范
文章目录 Go (Golang) 工具之gsemver 什么是gsemver 动机 感谢 gsemver 安装 gsemver 使用 准备 git HEAD 基础 CLI 配置文件 语义化版本 2.0 ...
- 语义化版本控制模块-Semver
执行某些命令的时候,你是否遇到过提醒版本过低,需要升级版本的提示,那么对于版本号,是以一个怎样的规则来进行的限制和匹配的呢? semver, 是一个语义化版本号管理的模块,可以实现版本号的解析和比较, ...
- 语义化版本控制规范(SemVer)
参考链接 https://semver.org/lang/zh-CN/ 语义化版本 2.0.0 (透过版本号的改变来传达信息.) 摘要 版本格式: 主版本号.次版本号.修订号 版本号递增规则如下: 1 ...
- php 语义解析,[扩展推荐] PHP 语义化版本(SemVer)辅助库
SemVer 是由 Chris Kankiewicz 开发的一个语义化的提取版本号中各种信息的 PHP 辅助库.支持解析.递增和比较等特性. 下面是初始化 SemVer\Version 对象的基本用法 ...
最新文章
- ios架构篇-2 国际化多语言
- 数据库收缩:NOTRUNCATE与TRUNCATEONLY
- 征战蓝桥 —— 2018年第九届 —— C/C++B组第1题——第几天
- Python的功能模块[3] - binascii - 编码转换
- 堆排序 heapsort
- 计算机病毒鬼畜,[原创]彩虹猫病毒的逆向
- 二进制搜索树(BSTs) 和AVL 树
- 设置计算机不从update获取驱动,如何让“Windows更新”不更新驱动程序
- 搜索竞价推广方式OCPC VS CPC,谁更强
- 2017年10月19日 第十次总结
- RuoYi-Vue——Swagger文档401问题
- AD7606数据转换
- 元学习之《On First-Order Meta-Learning Algorithms》论文详细解读
- Linux下线程池源码实现
- ZCMU--5066: 黑暗长廊
- 【机房重构】-UNL图回顾
- 计算机软件分为哪几个层次结构,信息系统的基本结构一般分为哪四个层次
- 两种include方式的作用
- 计算机80坐标转换经纬度,西安80坐标系(高斯投影)转经纬度(示例代码)
- 测试2k显示器的软件,高性价比的27吋2K显示器 AOC Q27P1U评测