Semantic Versioning
在早期,开发者安装某个软件包时,发现这个软件包里又依赖不同特定版本的其它软件包。随着系统功能越来越复杂,依赖的软件包越来越多,依赖关系也越来越深,这个时候可能面临版本控制被锁死的风险。这就是「依赖地狱」的问题。
因此,Github 起草了一个具有指导意义的,统一的版本号表示规则,称为 Semantic Versioning(语义化版本),即 Semver。目前它是由 npm 的团队维护。
Semver 的出现,规定了版本号如何表示,如何增加,如何进行比较,不同的版本号意味着什么。遵从了 Semver 规范的包依赖会非常清晰,不会出现循环依赖、依赖冲突等常见问题。
版本格式
majol
主版本,一般代表着很大的变更,例如vue 1.x和vue 2.x、 webpack 3.x和webpack 4.x
minor
次版本,一般代表着新feature的出现
patch
般不包含新功能,只是bugfix或和功能关系不大的修改
pre-release
预发行版本,一般用于正式版发行前的验证、联调和测试。和正式版本号之间用-连接
预发版本类型:
- alpha: 内部版本。此版本表示该软件在此阶段主要是以实现软件功能为主,通常只在软件开发者内部交流,一般而言,该版本软件的 Bug 可能还较多,需要继续修改。
- beta: 公测版本。该版本相对于 alpha 版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,需要经过多次测试来进一步消除,此版本主要的修改对像是软件的 UI,这个阶段的版本也会一直加入新的功能。
- rc: 即 Release candiate,正式版本的候选版本。该版本已经相当成熟了,基本上不存在导致错误的 BUG,与即将发行的正式版相差无几,不会再加入新的功能了,主要着重于除错。
pre-release后面跟着的数字
发布次数
版本大小比较
2.3.2 > 2.2.17 > 2.2.17-beta.1 > 2.2.17-beta.0 > 2.2.17-alpha.1 > 2.2.16
版本范围
// 大于、小于、大于等于、小于等于
>、<、 v=、<=
//- 表示范围,边界可等
- :1.2.3 - 2.3.4 := >=1.2 .3 <=2.3 .4I.
// x 表示通配,和各种语言的通配符一样
x :1.2.x := >=1.2.0 <1.3.0
// ~ 表示限制minor版本的升级
~ :~1.2.3 := >=1.2.3 <1.(2+1).0 := >=1.2.3 <1.3.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
Changelog
Changelog是以时间为倒序的列表,记录所有版本的变动及变动说明。让使用我们提供库的用户看到changelog时能对库的变动一目了然
推荐使用release-it实现自动化的npm包版本控制和Changelog
release-it的能力:
- 根据git commit自动生成版本号
- 自动生成changelog
- 丰富的hooks用来定制发版逻辑
- 提供插件机制,高度可扩展
release-it的配置和使用
/**
*自动生成Changelog
*根据gitcommitmsg选择版本
*可以手动发布pre-release版本
*npm发版后自动打git tag
*/
{
"hooks":{
"after:bump":"auto-changelog -p"
},
"git":{
"changelog": "auto-changelog --stdout --commit-limit false",
"requireCleanWorkingDir": false,
"requireUpstream": true,
"requireCommits": false,
"addUntrackedFiles": false,
"commit": true,
"commitMessage": "version: release ${version}",
"commitArgs":"",
"tag": true ,
"tagName":"{version}",
"tagAnnotation":"Release sfversion}",
"tagArgs":"",
"push": true,
"pushArgs":"--folow-tags",
"pushRepo":"origin",
},
"npm":{
"publish": true,
"publishPath":"",
"access": null,
"otp": null
},
"plugins":{
"@release-it/conventional-changelog":{
"preset": "angular",
"infile":"CHANGELOG.md"
}
}
}