最近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(语义化版本号)扫盲相关推荐

  1. Semver(语义化版本号)扫盲 1

    前言 最近在处理创建指定版本的 react native 项目的时候,由于自己的粗心大意,命令写成了这样:react-native init demo --version0.47.2 创建的一直是最新 ...

  2. Semver语义化版本号和npm包之semver的相关使用

    依赖地狱 通俗而言,"依赖地狱"指开发者安装某个软件包时,发现这个软件包里又依赖不同特定版本的其它软件包.随着系统功能越来越复杂,依赖的软件包越来越多,依赖关系也越来越深,这个时候 ...

  3. semver语义化版本号

    semver语义化版本号 语义化版本号各位置的含义 更详细的介绍,见简书的这篇日志 版本号:X.Y.Z X: 代表发生了不兼容的API改变 Y: 代表向后兼容的功能性变化 Z: 代表向后兼容bug f ...

  4. npm包 semver模块【语义化版本号】

    npm包 semver模块 Semver 简介 (Semantic Versioning) Semver 实际案例 ---------------------------------------- 一 ...

  5. 语义化版本号规范(SemVer)

    概念 语义化的版本控制(Semantic Versioning),简称语义化版本,英文缩写为 SemVer. 语义化版本通过一组简单的规则及条件来约束版本号的配置和增长.这些规则是根据(但不局限于)已 ...

  6. Go (Golang) 工具之自动化版本工具 gsemver | semver 语义化版本规范

    文章目录 Go (Golang) 工具之gsemver 什么是gsemver 动机 感谢 gsemver 安装 gsemver 使用 准备 git HEAD 基础 CLI 配置文件 语义化版本 2.0 ...

  7. 语义化版本控制模块-Semver

    执行某些命令的时候,你是否遇到过提醒版本过低,需要升级版本的提示,那么对于版本号,是以一个怎样的规则来进行的限制和匹配的呢? semver, 是一个语义化版本号管理的模块,可以实现版本号的解析和比较, ...

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

    参考链接 https://semver.org/lang/zh-CN/ 语义化版本 2.0.0 (透过版本号的改变来传达信息.) 摘要 版本格式: 主版本号.次版本号.修订号 版本号递增规则如下: 1 ...

  9. php 语义解析,[扩展推荐] PHP 语义化版本(SemVer)辅助库

    SemVer 是由 Chris Kankiewicz 开发的一个语义化的提取版本号中各种信息的 PHP 辅助库.支持解析.递增和比较等特性. 下面是初始化 SemVer\Version 对象的基本用法 ...

最新文章

  1. ios架构篇-2 国际化多语言
  2. 数据库收缩:NOTRUNCATE与TRUNCATEONLY
  3. 征战蓝桥 —— 2018年第九届 —— C/C++B组第1题——第几天
  4. Python的功能模块[3] - binascii - 编码转换
  5. 堆排序 heapsort
  6. 计算机病毒鬼畜,[原创]彩虹猫病毒的逆向
  7. 二进制搜索树(BSTs) 和AVL 树
  8. 设置计算机不从update获取驱动,如何让“Windows更新”不更新驱动程序
  9. 搜索竞价推广方式OCPC VS CPC,谁更强
  10. 2017年10月19日 第十次总结
  11. RuoYi-Vue——Swagger文档401问题
  12. AD7606数据转换
  13. 元学习之《On First-Order Meta-Learning Algorithms》论文详细解读
  14. Linux下线程池源码实现
  15. ZCMU--5066: 黑暗长廊
  16. 【机房重构】-UNL图回顾
  17. 计算机软件分为哪几个层次结构,信息系统的基本结构一般分为哪四个层次
  18. 两种include方式的作用
  19. 计算机80坐标转换经纬度,西安80坐标系(高斯投影)转经纬度(示例代码)
  20. 测试2k显示器的软件,高性价比的27吋2K显示器 AOC Q27P1U评测

热门文章

  1. leetcode算法题--盛最多水的容器
  2. axios vue 回调函数_Vue 02 —— Vue 入门小案例~使用 Axios 中的GET、POST请求
  3. 剖析nodejs的事件循环
  4. 【规范】前端编码规范——jquery 规范
  5. 多线程共享内存的问题
  6. 安装好android的adt以后重启eclipse,但是没有创建AVD的图标
  7. 如何查看mysql索引
  8. 电脑病毒反抗杀毒软件的主要手段
  9. 在创建的Silverlight Control中使用图片
  10. 字段定义_两大高招逐浪CMS中定义省地市县三级字段显示方式