论「版本号」的正确使用方式

版本号,说白了就是我们为项目的每个不同版本起的标识号,其被广泛运用于开发的各种场景:NPM(Node Package Manager) 的版本定义、对 NPM 包的特定版本的依赖指定、Git 的 daily 版本号分支等等。面对如此多的场景,版本号的命名却存在很大问题。例如:

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

版本号的命名

  根据国际主流的惯例,我们使用「语义化版本(Semantic Versioning)」的命名方式,有时简称 SemVer。语义化版本号(以下简称「版本号」)的格式是:<major>.<minor>.<patch>。即使用三位非负整数,以点号.连接。

  • 如:1.4.156.2.0

每一位版本号的含义

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

所以,当我们明确了每一位的含义和作用后,就不会陷入「每次只改最末位」的尴尬中了。那如何判断一个修改应该是改动修订号还是次版本号呢?视情况而定。比如对于「修改了 app 图标」这件事来说,如果只是调整了图标的间距位置,那么可以认作问题修复;如果把整个图标换了,配上了不同的标语,那么这应该是一次功能改动。

注意事项

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

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

  • 0.1.0
  • 0.1.1
  • 0.1.2
  • 0.2.0
  • 1.0.0
  • 1.1.0
  • 1.1.1
  • ……

快速修改版本号

如果一个包发布在 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 字母表中的顺序来进行。

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

  • 0.9.0
  • 1.0.0-alpha.1
  • 1.0.0-alpha.2
  • 1.0.0-beta.1
  • 1.0.0-rc.1
  • 1.0.0
  • 1.0.1
  • ……

依赖的版本号标记法

  我们广泛使用的 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 包中的依赖有几种形式的字段:dependencies、devDependencies、peerDependencies。以下简要介绍下各字段的不同含义,以及使用场景。

字段 含义 依赖被安装的时机 使用场景
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 仅在特定场景下有用,默认不使用此字段。

源码免费下载地址:http://www.jinhusns.com/Products/Download

时间: 2024-10-21 22:34:12

论「版本号」的正确使用方式的相关文章

Linux 小知识翻译 - 「版本号」的命名方式

包括OS,所有的软件都有版本号信息.一般来说,版本号的增大表示软件的功能增强了或者修正了一些Bug,也就是表示软件更新了. 版本号的命名方式没有统一的标准.每种软件都不一样. 大部分情况下,版本号以「X.Y」或者「X.Y.Z」的方式命名,软件有大幅的功能增强时,增加「X」的数值,只有微小的改变时,增加「Y」或者「Z」的数值. 因此,「X」被称为「主版本号」,「Y」或者「Z」被称为「次版本号」. 但是,版本号有时还有其他的含义.比如Linux内核的版本号,现在是以「X.Y.Z」的方式命名的,200

「译」如何正确学习JavaScript

原文:How to Learn JavaScript Properly 目录 不要这样学习JavaScript 本课程资源 1-2周(简介,数据类型,表达式和操作符) 3~4周(对象,数组,函数,DOM,jQuery) JavaScript终极编辑器:WebStorm 第一个项目-动态问答应用 5-6周(正则表达式,Window对象,事件,jQuery) 7周,可延长到8周(类,继承,HTML5) 继续提升 一些鼓励的话 上面的课程大纲提供了一个结构化和富有启发性的学习线路,从初学者到有所建树,

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

引用原文评论的一句话:条理清晰, 如此甚叼! 论版本号的正确打开方式 作者: 法海 发表于: 2016-08-04 版本号广泛运用于开发的各种场景:NPM 包的版本定义.对 NPM 包的特定版本的依赖指定.git 的 daily 版本号分支…… 面对如此多的场景,版本号的命名却存在很大问题.举些例子: 开始写一个新项目 / 模块时,不管三七二十一,都从 0.0.1 起版本,直到项目不再维护时,版本还停留在 0.0.48,前两位永远都是 0. API 变化巨大,而版本号雷打不动一步一个脚印.一个二

Android逆向之旅---静态方式分析破解视频编辑应用「Vue」水印问题

一.故事背景 现在很多人都喜欢玩文艺,特别是我身边的UI们,拍照一分钟修图半小时.就是为了能够在朋友圈显得逼格高,不过的确是挺好看的,修图的软件太多了就不多说了,而且一般都没有水印啥的.相比较短视频有一个比较有逼格的编辑工具「Vue」个人已经用了很长时间了,拍出来的视频借助强大滤镜真的很好看,显得逼格也高,更重要的是他有我最喜欢的功能就是可以添加视频背景音乐,选择自己喜欢的音乐,然后还可以编辑这段背景音乐,反正我个人觉的这个是我最喜欢用的产品了.但是好用的东西必定有它不好的地方,因为他真的很强大

大数据和「数据挖掘」是何关系?---来自知乎

知乎用户,互联网 244 人赞同 在我读数据挖掘方向研究生的时候:如果要描述数据量非常大,我们用Massive Data(海量数据)如果要描述数据非常多样,我们用Heterogeneous Data(异构数据)如果要描述数据既多样,又量大,我们用Massive Heterogeneous Data(海量异构数据)--如果要申请基金忽悠一笔钱,我们用Big Data(大数据) 编辑于 2014-02-2817 条评论感谢 收藏没有帮助举报作者保留权利 刘知远,NLPer 4 人赞同 我觉得 大数据

「MoreThanJava」计算机发展史—从织布机到IBM

「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 不论新老朋友 我相信您都可以 从中获益.如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力! 一.织布机 | 一切的开端 如今代表智能现代的计算机与老式织布机的血缘关系超乎你的想象.无论是摆在写字台上的 台式机.塞在口袋里的 掌上电脑.

「Unity」与iOS、Android平台的整合:3、导出的Android-Studio工程

本文属于「Unity与iOS.Android平台的整合」系列文章之一,转载请注明出处. Unity默认导出的是Android-Eclipse工程,毕竟Eclipse for Android开发在近一两年才开始没落,用户量还是非常巨大的. 个人认为AndroidStudio非常好用,能轻易解决很多Eclipse解决不了或者很难解决的问题. 所以我将Unity导出的Andoid工程分为Eclipse和AndroidStudio两部分. 不过我之后的相关内容都会使用AndroidStudio,希望依然

LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 N NN 个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的 N NN 个数中第 K KK 大的数字的最小值是多少. 输入格式 第一行给出三个整数

技术人员应对「考核」的一些思考

来这个公司实习已经半年多了,在年前经历了一次年终考核,最终对我的工作的评级是 C(及格-符合当前职位的工作),让我不禁思考自己在项目中的一些工作的问题,为什么我是C?是我做的不够好吗?或者说在哪里做的不够好? 从考核流程来看,基本上是 CTO 与 Team Leader 对团队成员的「年终总结与次年工作计划」进行Rank,个人狭义的认为「考核」的主要支持材料就是这个总结了. 他山之石 其他公司是怎么考核的呢?说实话我也不太清楚,刚入行,只能通过搜索了解,在网上了解到有以下几种:发精品博客.发论文