关于版本号
SemVer
npm和很多库、软件使用的版本命名规范都基于:SemVer
SemVer是 Semantic Version(语义化版本)缩写后形成的单词,为什么要“语义化”?
语义化版本命名并给予清楚的定义,让你对软件使用者传达意向变得容易。一旦这些意向变得清楚,弹性(但又不会太弹性)的依赖规范就能达成。
semver可以作为一个node模块,同时也可以作为一个命令行工具。功能包括:
- 比较两个版本号的大小
- 验证某个版本号是否合法
- 提取版本号,例如从“=v1.2.1”体取出"1.2.1"
- 分析版本号是否属于某个范围或符合一系列条件
- 等等...
npm install --save semver npm install semver -g
主要将npm管理版本号,对semver的使用可以查看:腾讯云 - SemVer
格式 aasas爱上
SemVer规定的版本号格式为:主版本号.次版本号.修订号
对应的英文是:Major.Minor.Patch
必须是非负整数,如:2.3.1
⚠️ 同时需要注意升级版本的规范: patch:修复bug,兼容老版本 minor:新增功能,兼容老版本 major:新的架构调整,不兼容老版本
这是很常见的也是最基本的版本号规范,可以称它为“标准版本”,后面还可以接“预发布”版本(先行版本):
预发布主版本号.预发布次版本号.预发布修订号
对应的英文是:PreMajor.PreMinor.PrePatch
预发布版本的完整写法为:主版本号.次版本号.修订号 - 预发布主版本号.预发布次版本号.预发布修订号
中间用 - 分隔;
先行版的优先级低于相关联的标准版本。被标上先行版本号则表示这个版本并非稳定而且可能无法满足预期的兼容性需求;
必须由 ASCII 字母数字和连接号 [0-9A-Za-z-] 组成,如: 2.3.1-beta 2.3.1-2 2.3.1-alpha.1.0
更多细节可以查看文档:版本号规范
npm版本号
也就是package.json中的dependencies依赖包的版本号,可以看到版本号都是符合上述要求的,但是版本号前面有些奇奇怪怪的符号,这些符号在npm包依赖管理中起到了重要作用。
版本管理符号
| 版本号符号 | 说明 | 栗子🌰 |
|---|---|---|
| version | 必须匹配某个版本 | 1.1.2,表示必须依赖1.1.2版 |
| >version | 必须大于某个版本 | >1.1.2,表示必须大于1.1.2版 |
| >=version | 可大于或等于某个版本 | >=1.1.2,表示可以等于1.1.2,也可以大于1.1.2版本 |
| <version | 必须小于某个版本 | <1.1.2,表示必须小于1.1.2版本 |
| <=version | 可以小于或等于某个版本 | <=1.1.2,表示可以等于1.1.2,也可以小于1.1.2版本 |
| ~version | 大概匹配某个版本 如果minor版本号指定了,那么minor版本号不变,而patch版本号任意; 如果minor和patch版本号未指定,那么minor和patch版本号任意 | ~1.1.2,表示>=1.1.2 <1.2.0,可以是1.1.2,1.1.3,.....,1.1.n; ~1.1,表示>=1.1.0 <1.2.0,可以是同上; ~1,表示>=1.0.0 <2.0.0,可以是1.0.0,1.0.1,1.0.2,.....,1.0.n,1.1.n,.....,1.n.n |
| ^version | 兼容某个版本,这也是 npm install <pkg> 时默认的版本管理符号;版本号中最左边的非0数字的右侧可以任意; 如果缺少某个版本号,则这个版本号的位置可以任意 | ^1.1.2 ,表示>=1.1.2 <2.0.0; ^0.2.3 ,表示>=0.2.3 <0.3.0; ^0.0,表示 >=0.0.0 <0.1.0 |
| x-range | x的位置表示任意版本 | 1.2.x,表示可以1.2.0,1.2.1,.....,1.2.n |
| *-range | 任意版本,""也表示任意版本 | *,表示>=0.0.0的任意版本 |
| version1 - version2 | 大于等于version1,小于等于version2 | 1.1.2 - 1.3.1,表示包括1.1.2和1.3.1以及他们件的任意版本 |
| range1 || range2 | 满足range1或者满足range2,可以多个范围 | <1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 < 3.0.0,表示满足这3个范围的版本都可以 |
npm info
可以查看当前包的信息,这里跟版本相关的信息为:
{
'dist-tags': { latest: '1.0.1', '-beta': '1.0.2-1' },
versions: [ '1.0.0', '1.0.1', '1.0.2-0', '1.0.2-1' ],
}2
3
4
其中,dist-tags的latest就是默认的版本,当我们使用 npm install xx或npm publish时,默认就会下载latest对应的版本 或发布到latest。
npm version
npm version 指令的用法:npm-version
该命令执行步骤:
- 检查git工作目录
- 运行preversion脚本, 可以写些触发测试的脚本
- 结合当前包当前版本信息和patch, minor, major等,生成新版本号,更新package.json中version字段
- 运行version脚本
- git提交并打标签
- 运行postversion脚本
根据上述步骤可知:如果使用git进行项目管理,在进行版本提升前,需要先将修改内容提交,即commit,然后再执行npm version xxx进行版本提升,版本提升会自动被提交到当前分支中。
可以使用的指令有:npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease | from-git]
举个栗子 🌰:
| 命令 | 说明 | 例子 |
|---|---|---|
| npm version major | 升级Major版本号 | 1.2.3 --> 2.0.0 |
| npm version minor | 升级Minor版本号 | 1.2.3 --> 1.3.0 |
| npm version patch | 升级Patch版本号 | 1.2.3 --> 1.2.4 |
| npm version premajor | 升级PreMajor版本号 | 1.2.3 --> 2.0.0-0 1.2.3-beta.1.0.1 --> 1.2.3-beta.2.0.0 |
| npm version preminor | 升级PreMinor版本号 | 1.2.3 --> 1.3.0-0 1.2.3-beta.1.0.1 --> 1.2.3-beta.1.1.0 |
| npm version prepatch | 升级PrePatch版本号 | 1.2.3 --> 1.2.4-0 1.2.3-beta.1.0.1 --> 1.2.3-beta.1.0.2 |
| npm version prerelease | 升级PreRelease版本号 | 1.2.3-0 -->1.2.3-1 |
| npm version from-git | 从git获取版本信息 | - |
npm publish
修改完版本号,最后一步就是发布npm包了,命令是:npm publish(npm-publish)
和版本相关的是 --tag 参数。
比如当前包名为:vinsea-test,包的版本为:1.2.3-beta.1.0.2
npm publish --tag haha那么,当前的包会带上haha这个tag,可以把它理解为git的branch。
当用户安装时可以通过@符号指定tag或者特定版本号:
npm install vinsea-test@haha -S这样就会把 1.2.3-beta.1.0.2 这个版本的包下载下来。
npm dist-tag
当我们的prerelease版本已经稳定了,可以重新设置为稳定版本:
npm dist-tag add 1.2.3-beta.1.0.2 latest此时用户如果运行npm install xx,安装的就是1.2.3-beta.1.0.2版本。