在软件开发中,不管提供的是应用还是公共的类库,我们都应该使用一套规范的、统一的版本号规则。这样一套规则可以使软件版本的增长和其每一个版本信息更加清晰明了,才可以使得通过版本号进行的依赖管理变得有意义。这篇文章(语义化版本)就介绍了一种语义化版本控制规范。
版本号语义化规范
简单来说就是版本号格式为:主版本号.次版本号.修订号,意义及递增规则如下:
- 主版本号、次版本号、修订号都为非负整数,禁止在数字前方补零。
- 当你做了向下兼容的问题修正,递增修订号。
- 当你做了向下兼容的功能性新增,递增次版本号。
- 当你做了不兼容的 API 修改,递增主版本号。
- 次版本号递增后,修订号清零。主版本号递增后,次版本号和修订号同时清零。
- 先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。(例如:1.0.0-alpha,先行版的优先级低于相关联的标准版本,即1.0.0版本是1.0.0-alpha版本后续的稳定且可能不兼容的版本)
- 建议以0.1.0作为最初的版本(虽然程序员以0作为开始,但0.0.0有点不对劲吧)
依赖管理中的版本号指明
有了上述的版本号的语义化规范后,就使得依赖管理不再混乱,可以明确标识。一般依赖管理中的依赖版本写为一个范围,在依赖更新时,依赖管理工具会将依赖的工具更新到范围内的最新版本。以 NPM 的语法(semver)为例,其他技术平台的依赖管理工具参考文档,只要遵守规范应该大同小异。
比较符号
-
<
、<=
,小于或小于等于特定的版本,例<1.3.0 -
>
、>=
,大于或大于等于特定的版本,包括主版本号的升级。例>1.3.0,1.3.9、2.5.3都会匹配。 -
=
,使用某一特定版本,若只写一个明确的版本号,=
为隐含默认的比较符。
范围连接符号
- 两个操作符通过空格连接,可以标识一个版本的上下限范围,例>=1.2.7 <1.3.0
-
||
符会将几个范围连成并集,例1.2.7 || >=1.2.9 <2.0.0,此时1.2.8不在范围内
高级语法
-
-
,
1.2.3 - 2.3.4 表示 >=1.2.3 <=2.3.4
1.2 - 2.3.4 表示 >=1.2.0 <=2.3.4
1.2.3 - 2.3 表示 >=1.2.3 <2.4.0
1.2.3 - 2 表示 >=1.2.3 <3.0.0
-
*
,x 或 X
* 表示 >=0.0.0
1.x 表示 >=1.0.0 <2.0.0
1.2.x 表示 >=1.2.0 <1.3.0
空字符等同于 * 等同于 >=0.0.0
1 等同于 1.*.* 等同于 >=1.0.0 <2.0.0
1.2 等同于 1.2.* 等同于 >=1.2.0 <1.3.0
-
~
,如果明确指明次版本号,则匹配所有修订号的变化,如果没有指明此版本号,则匹配所有次版本号和修订号的变化。
~1.2.3 表示 >=1.2.3 <1.3.0
~1.2 表示 >=1.2.0 <1.3.0 等同于 1.2.x
~1 表示 >=1.0.0 <2.0.0 等同于 1.x
-
^
,匹配规则是最左边非0位不变化,匹配其子级的所有版本
^1.2.3 表示 >=1.2.3 <2.0.0
^0.2.3 表示 >=0.2.3 <0.3.0
^0.0.3 表示 >=0.0.3 <0.0.4
当次版本号和修订号缺失或用*
表示时,其代表任意非负整数:
^1.2.x 表示 >=1.2.0 <2.0.0
^0.0.x 表示 >=0.0.0 <0.1.0
^0.0 表示 >=0.0.0 <0.1.0
^1.x 表示 >=1.0.0 <2.0.0
^0.x 表示 >=0.0.0 <1.0.0
Cocoapods 中的版本管理
Cocoapods 中的版本说明相对比较简单,也是使用符合指定范围的最新版本。
- 当不指明版本号时,表示使用当前的最新版本。
-
= 0.1
或0.1
,表示使用确定的 0.1 版本。 -
> 0.1
,所有大于 0.1 的版本。 -
>= 0.1
,所有大于等于 0.1 的版本。 -
< 0.1
,所有小于 0.1 的版本。 -
<= 0.1
,所有小于等于 0.1 的版本。 -
~> 0.1.2
,只匹配大于等于修订号位的最新版本,相当于>= 0.1.2
且< 0.2.0
网友评论