转载:淘宝前端团队的干货《论版本号的正确打开方式》

引用原文评论的一句话:条理清晰, 如此甚叼!

论版本号的正确打开方式

作者: 法海 发表于: 2016-08-04

版本号广泛运用于开发的各种场景:NPM 包的版本定义、对 NPM 包的特定版本的依赖指定、git 的 daily 版本号分支……

面对如此多的场景,版本号的命名却存在很大问题。举些例子:

  • 开始写一个新项目 / 模块时,不管三七二十一,都从 0.0.1 起版本,直到项目不再维护时,版本还停留在 0.0.48,前两位永远都是 0。
  • API 变化巨大,而版本号雷打不动一步一个脚印。一个二方包从 0.0.8 升级到 0.0.9就引起了整个项目的崩溃。
  • 依赖二方 / 三方包时,不知道该依赖哪个版本,有时随便指定了一个,有时则直接依赖了 *

版本号的命名

SemVer

根据国际主流的惯例,我们使用「语义化版本(Semantic Versioning)」的命名方式,有时简称 SemVer。

语义化版本号(以下简称「版本号」)的格式是:<major>.<minor>.<patch>。即使用三位非负整数,以点号 . 连接。

如:1.4.156.2.0

每一位版本号的含义

  1. <major> 即主版本号,俗称大版本升级。改动到主版本号时,标志着 API 发生了巨大变化,包括但不限于新增特性、修改机制、删除功能, 一般不兼容上一个主版本号
  2. <minor> 即次版本号,俗称小版本升级。当我们进行常规的新增或修改功能时,改动次版本号,但是 必须是向前兼容的。这也意味着我们 不能直接删除某个功能。如若必要,我们可以在 changelog 中标记某项功能为「即将删除(Deprecated)」,然后在下一个大版本中将其彻底删除。
  3. <patch> 即修订号,俗称 bug 修复。顾名思义,如果仅仅为了修复或调整一些小问题,我们就只改动修订号。

所以,当我们明确了每一位的含义和作用后,就不会陷入「每次只改最末位」的尴尬中了。

那如何判断一个修改应该是改动修订号还是次版本号呢?视情况而定。比如对于「修改了 app 图标」这件事来说,如果只是调整了图标的间距位置,那么可以认作问题修复;如果把整个图标换了,配上了不同的标语,那么这应该是一次功能改动。

注意事项

  • 版本号前不要加 v
  • 不要在数字前补 0。错误示例:01.12.03
  • 每一位版本号按照 +1 的速度递增,不要在版本号之间跳跃。
  • 主版本号停留在 0 的版本号,即 0.x.x 应当视作还在内部开发阶段的代码。如果代码有公共 API,此时不宜对外公开。
  • 1.0.0 的版本号用于界定公共 API 的形成。
  • 当次版本号递增时,修订号归零;当主版本号递增时,次版本号、修订号归零。
  • 进行新的开发时,版本号从 0.1.0 开始。
  • 如果不小心把一个不兼容的改版当成了次版本号发行,应当发行一个新的次版本号来更正这个问题并且恢复向下兼容。注意 不能去修改已发行的版本

一个典型的版本号发展示例

  1. 0.1.0
  2. 0.1.1
  3. 0.1.2
  4. 0.2.0
  5. 1.0.0
  6. 1.1.0
  7. 1.1.1
  8. ……

快速修改版本号

如果一个包发布在 NPM / TNPM 中,可以快速修改其版本号。会自动触发一个 git 提交。

 
# 递增一个修订号npm version patch

# 递增一个次版本号npm version minor

# 递增一个主版本号npm version major

预发版本号

在常规的版本号命名之上还有一个特殊类别,叫做预发版本号(prerelease version)。它表示当前版本是一个不稳定的版本,使用它时需要注意风险。

预发版本号的格式是 <major>.<minor>.<patch>-<tag>,即前半部分和常规版本号相同,然后跟上连接符 -,后面再跟上字母数字点号连接符([0-9A-Za-z-.])。

一个典型的预发版本号形如 1.0.0-beta.1。建议使用这种 <major>.<minor>.<patch>-<stage>.<num> 的形式。其中 <stage> 一般选用:alphabetarc

预发版本号是常规版本号的附属,因此在版本的大小比较上,仍然先比较常规版本号部分;对于预发标记部分的比较,则是根据 ASCII 字母表中的顺序来进行。

一个典型的预发版本号发展示例

  1. 0.9.0
  2. 1.0.0-alpha.1
  3. 1.0.0-alpha.2
  4. 1.0.0-beta.1
  5. 1.0.0-rc.1
  6. 1.0.0
  7. 1.0.1
  8. ……

依赖的版本号标记法

我们广泛使用的 NPM 本身也遵从 SemVer 版本号命名,除了包版本本身的定义之外,最重要的是对三方包依赖的版本号的定义,不当的写法将导致一系列潜在的问题。

指定可用的版本号范围

在 NPM 包的 deps 系列字段中,经常出现形如 ~1.0.4^2.1.1 这样的标记法,这种标记法标记的是「版本号范围(version range)」,它表示依赖的三方包其版本号只要落在定义版本号范围内,即算合法。另外,当运行 npm update 时,依赖的包将升级到版本号范围支持的最高版本。

版本号范围的标记符号有很多种,诸如比较符号 >=< 等;连接符 -;通配符 x*;模糊符 ^~。具体的用法可参考 NPM 官方文档,这里仅给出常用的标记方式。

含义 最简写法 使用通配符的写法 使用模糊符的写法 表达的版本号范围
仅跟进修复版本 1.0 1.0.x ~1.0.4 >=1.0.4 <1.1.0
跟进每个小版本更新 1 1.x1.x.x ^1.0.4 >=1.0.4 <2.0.0
始终升级到最新版 * * * >=0.0.0

我们建议在写法上采用 「使用通配符的写法」,并且一般情况下 「跟进每个小版本更新」,但 不「始终升级到最新版」,即书写为 1.x。由于 <major> 位版本是不向下兼容的,所以在大版本的控制上,仍然采用人为干预以保证安全。

不同的 deps 字段

NPM 包中的依赖有几种形式的字段:dependenciesdevDependenciespeerDependencies。以下简要介绍下各字段的不同含义,以及使用场景。

字段 含义 依赖被安装的时机 使用场景
dependencies 运行时依赖,包的调用者需要使用到的依赖 执行 npm install 后会把当前包的 dependencies 字段中的所有依赖项安装到 ./node_modules 目录。
执行 npm install xxx 后会把 xxx 安装到 ./node_modules 下,同时会安装 xxx 的 dependencies 字段依赖项到 ./node_modules/xxx/node_modules 目录。 
执行 npm install xxx --save 后会额外把 xxx 作为依赖存到当前包的 dependencies 字段中。
所有程序运行需要用到的依赖代码,如 lodash 等。
devDependencies 开发时依赖,包的开发维护者需要使用到的依赖 执行 npm install 后也会把当前包的 devDependencies 字段中的所有依赖项安装到 ./node_modules 目录。
执行 npm install xxx 后会把 xxx 安装到 ./node_modules 下,但不会安装 xxx 的 devDependencies 字段依赖项。 
执行 npm install xxx --save-dev 后会额外把 xxx 作为开发时依赖存到当前包的 devDependencies 字段中。
一般是一些开发调试的辅助工具,如测试工具 mocha、构建工具 gulp 等。
peerDependencies 仅在 特定场景 下有用,默认不使用此字段。

引用

    1. Semantic Versioning
    2. NPM SemVer
时间: 2024-10-05 06:16:27

转载:淘宝前端团队的干货《论版本号的正确打开方式》的相关文章

选型宝访谈:什么是APP测试的正确打开方式?

写在前面 在今天的移动互联网时代,信息系统移动化成为企业CIO/CTO们最关心的话题之一.虽然移动化有很多路径,但相对来说,开发原生APP仍然是性能和体验最佳的一种方式. 但是,开发APP并非易事,尤其是其测试过程,常常令人崩溃.一方面,APP的版本更新速度越来越快,另一方面,APP要适配的机型越来越繁杂.每一次版本升级,开发或测试人员都要针对各种机型,做功能.性能.安全等一系列测试-- 下面,就让我们一起来听,选型宝首席架构师李维良与Aella的精彩对话吧. 李维良(主持人) 在移动互联网时代

转:阿里巴巴集团技术丛书——淘宝一线团队实践

原文来自于:http://download.csdn.net/album/detail/1013/2 阿里巴巴集团技术丛书——淘宝一线团队实践0 浏览量:7840下载次数:94创建者:broadview2006创建时间:2014-09-25 淘宝技术这十年,淘宝技术十年事.来自阿里一线专家作译图书精选. 阿里 淘宝 分享到: 共6个 直接下载 Storm 实战:构建大数据实时计算试读样章0 上传者:broadview2006      上传时间:2014-08-14 阿里巴巴集团技术丛书,大数据

淘宝前端工程师推荐书笔籍大集合

写了几年的不正规前端,从乱的不可开交的css/html/js,到发现需要看书才能解决问题的状态.这里推荐一下 淘宝前端书籍:http://www.xiaomengku.com/index.php/album?id=6 多看书还是可以很好的理顺自己的思维,写了个小js库(HHJsLib)还在不断完善中,此库指在简化后端的开发任务,从减少后端人员对于前端效果纠结时间,来达到加快网站开发速度的目的.有兴趣的同学可以上GitHub交流下:https://github.com/HongJuZiNetStu

我的阿里梦——淘宝前端必备技能

每天下班路过阿里,看到里面的灯火嘹亮,心里惴惴不安,我也想进阿里,怎么破. 阿里的前端是不是都是大牛?我给他们的差距到底有多大,这个问题困扰我很久,然而,百无聊赖的我习惯性的打开淘宝官网,然后习惯性的f12,我发现了新大陆…… 我仔细看看,很迷茫,看懂的不多,不过,我决定,慢慢来,先搞懂他们都是干啥的,然后晚点偷偷的学. 下面,让小屌丝给你们整理下他们都是干啥用的吧. 1: Angula AngularJS诞生于Google是一款优秀的前端JS框架,已经被用于Google的多款产品当中.Angu

[转载]淘宝API调用 申请 获取session key

http://www.cnblogs.com/zknu/archive/2013/06/14/3135527.html 在调用淘宝的API时,我们都会用到appkey,appsecret,appsession. 1.我们申请应用就会有appkey和appsecret了 2.正式环境下获取SessionKey 注意:web插件平台应用和web其它应用在正式环境下是同样的获取方法 1).WEB应用 回调URL:http://cnblogs.com 访问http://container.open.ta

淘宝的设计印证了我的思路正确

前一段在设计一个电商平台,站内会有很多家居装修装饰的图片展示,所以我的设计思路是黑白色显示简洁.逼格高,另外介于站点的内容特点,这种颜色搭配最容易让内容出彩.此思路当时并没有被采纳. 今天看到淘宝出了big这一子域名的站点,(big.taobao.com),这个站点的内容也以图片为主,为了显示逼格高,采用了黑白色作为背景色,加上头部醒目的红色menu部分,背景 VS menu VS 绚烂内容 这三层视觉层次就显得非常清晰.淘宝的设计印证了我的思路正确. 下面是截图:(一个是只有menu和背景:另

淘宝前端工程师:国内WEB前端开发十日谈

转自:http://www.jianshu.com/p/8cf2df3fdbf2 一直想写这篇“十日谈”,聊聊我对Web前端开发的体会,顺便解答下周围不少人的困惑和迷惘.我不打算聊太多技术,我想,通过技术的历练,得到的反思应当更重要. 我一直认为自己是“初级”前端开发工程师,一方面我入道尚浅,只有短短几年,另一方面我自知对技术的钻研并不深入,可能是由于环境的原因,当然最重要的是,我幸运的参与到互联网崛起的浪潮之巅.时势造就了一批技能薄弱但备受追捧的“弄潮者”,这在很大程度上影响我们对“技术本质”

七天学会NodeJS (原生NodeJS 学习资料 来自淘宝技术团队)

NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象.而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS

转淘宝前端的一篇文章作备份

当前端也拥有 server 的能力 作者: 阎王 发表于: 2016-03-09 今天看了不少文章,比较感兴趣的是 Cache API.它是浏览器 Request/Response 的缓存管理工具,其使用风格和运用场景让我瞬间联想到了 ServiceWorker 和 Fetch API,相信很多同学也多次看到过这两个东西,本文会对它们做一个简洁的介绍,并谈一谈我对这些新玩具的看法. Fetch API 传统的 XMLHttpRequest,出了两个版本,在 XHR2.0 中引入了跨源请求.上传进