软件开发中,为了合理地管理软件版本,我们需要一定的约束,以避免软件版本的“依赖地狱”问题。为此 Github 起草了一个具有指导意义的,统一的版本号表示规则,称为 Semantic Versioning(语义化版本表示)。该规则规定了版本号如何表示,如何增加,如何进行比较,不同的版本号意味着什么。
该规则指定了一个软件版本的基本格式:major.minor.patch
:
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。
有些软件在正式发布前会有一些先行测试版,这个时候可以在版本后缀加上特定的修饰,主要有三种:alpha
、beta
、rc
,完整格式:major.minor.patch-alpha
。其具体的含义:
也可以在修饰版本后加上数字后缀,表示先行版的继续划分:major.minor.patch-alpha.0
、major.minor.patch-rc.1
。
major.minor.patch
格式,并且每一位数字不能为负,也不能在数字前方补零,并且版本号也是递增的。1.0.0
为界定的公共版本,之前的版本如 0.x.x
为开发版,升级到 1.x.x
及以上则表示软件版本正式推出可用,开发者需要对此负责。前面提到的是关于 Semantic Versioning 的规则知识,这里补充一个知识点,是关于版本前缀的。在使用 npm 的时候,我们经常能看到安装的包长这样:
{
"name": "betamee.github.io",
"description": "blog site repo",
"version": "1.0.2",
"author": "BetaMee <gongxq95@gmail.com>",
"husky": {
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
},
"dependencies": {
"gatsby": "~2.15.3",
"node-sass": "~4.12.0",
"react": "^16.9.0",
"react-dom": "^16.9.0",
"ts-node": "^8.3.0",
"typescript": "*"
}
}
这里的 ^
、~
、*
的作用是指:
~
会匹配最新的小版本依赖包,比如 ~1.2.3
会匹配所有 1.2.x
版本,但是不包括 1.3.0
^
会匹配最新的大版本依赖包,比如 ^1.2.3
会匹配所有 1.x.x
的包,包括 1.3.0
,但是不包括 2.0.0
*
会安装最新版本的依赖包^
、*
可能会引起版本不兼容,这里需要注意,建议使用~
来标记版本号。