语义版本校验
校验语义化版本号并解析区间。
版本解析
- 主版本号 MAJOR
- 次版本号 MINOR
- 修订号 PATCH
- 先行版本号
- 编译元数据
区间解析
JSON 结果
什么才算版本号
SemVer 2.0.0 的严格语法:三段非负 ASCII 整数,且不得有前导零。
- MAJOR.MINOR.PATCH
- 不兼容 / 向下兼容新增 / 修复
- 1.2.3-alpha.1
- 先行版本号,优先级低于 1.2.3
- 1.2.3+build.5
- 编译元数据,不参与优先级
- 1.2.3-0.3
- 先行版本号里的数字段按数值比较
- v1.2.3
- 不是语义化版本(规范 FAQ 原文)
- 01.2.3
- 不合法:前导零
- 1.2.3-01
- 不合法:先行数字标识符补零
- 1.2.3+0.09
- 合法:编译元数据允许前导零
区间运算符
- 1.2.3
- 只匹配这个版本
- ^1.2.3
- 兼容区间:>=1.2.3 <2.0.0-0
- ~1.2.3
- 只放修订:>=1.2.3 <1.3.0-0
- >=1.2.3 <2.0.0
- 同一集合内是「且」的关系
- 1.2.3 - 2.0.0
- 闭区间,两侧都必须有空格
- 1.2.x / 1.x / *
- 局部版本与通配
- a || b
- 并集:任一集合命中即可
- ~>1.2.3
- npm 历史别名,按 ~1.2.3 处理
npm 怎么补全局部版本
以下结果与 node-semver 实测一致;-0 哨兵用来排除下一个系列的先行版本。
| 区间 | 补全后 |
|---|---|
| ^1.2.3 | >=1.2.3 <2.0.0-0 |
| ^0.2.3 | >=0.2.3 <0.3.0-0 |
| ^0.0.3 | >=0.0.3 <0.0.4-0 |
| ^1 | >=1.0.0 <2.0.0-0 |
| ~1.2.3 | >=1.2.3 <1.3.0-0 |
| ~1.2 | >=1.2.0 <1.3.0-0 |
| ~1 | >=1.0.0 <2.0.0-0 |
| 1.2.x | >=1.2.0 <1.3.0-0 |
| 1.x | >=1.0.0 <2.0.0-0 |
| 1.2.3 - 2.0.0 | >=1.2.3 <=2.0.0 |
| 1.2.3 - 2 | >=1.2.3 <3.0.0-0 |
| >1.x | >=2.0.0 |
先行版本号的优先级
1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0
数字段按数值比较且低于字母段;前缀相同时段数少者优先级更低。编译元数据完全不参与。
常见错误
多数是从 package.json 或聊天窗口直接粘出来的。
- 1.2.3
- 中文输入法的全角数字:第 1 个字符是 U+FF11,SemVer 只接受 ASCII 数字 0-9,本工具不做归一。
- 1。2。3
- 全角句点 U+3002:看起来像点,实际是非法字符。
- 01.2.3
- 主版本号有前导零;npm 宽松口径会静默改写为 1.2.3。
- 1.2.3-01
- 先行数字段补零;npm 宽松口径读成 1.2.3-1,这正是竞品报成 Valid 的那类输入。
用的是哪本规则
- 版本号的判定口径是严格的 SemVer 2.0.0:不开 loose、不改写、不归一。
- 区间口径是 npm 的 node-semver,因为 SemVer 规范本身不定义区间。
- 区间这一侧本工具比 npm 更严格:不接受 v 前缀与前导零,也不把 || 的空侧当成任意版本。
- 不合法版本旁边给出的两条读法来自 semver.valid(v, {loose:true}) 与 semver.coerce(v),只是信息,不代表通过。
- 位置按码点计:界面从 1 起,JSON 里的 index 从 0 起。
怎么用
- 把 1.2.3-beta.1+build.5 这样的版本号粘进左框,边输入边出结果,没有任何需要点的按钮。
- 需要看区间时,把 ^1.2.0 这类 npm 区间粘进右框。
- 先看徽标:合不合法;不合法时是哪条规则、第几个字符。
- 想看 npm 的 includePrerelease 口径,勾选「包含先行版本」。
- 展开「JSON 结果」可复制或下载完整问题列表。
示例
版本号 + 区间
1.2.3 1.2.x || >=3.0.0-rc.1
结果
版本号合法。区间拆成 2 个集合:集合 1 由 1.2.x 补全为 >=1.2.0 <1.3.0-0,边界 [1.2.0, 1.3.0);集合 2 为 >=3.0.0-rc.1。判定:满足,命中集合 1。
把版本换成 3.0.0-rc.1 就会命中集合 2,因为它本身就是带先行标识的比较器。
局限
- 判定口径是严格 SemVer,所以 v1.2.3、1.2.3-01 会被判不合法,而 npm 的宽松口径会接受或改写它们。
- 区间只实现 npm node-semver 的常见语法,不涉及 git describe、Cargo、PEP 440、Go module 版本。
- 不查包仓库:无法回答 ^1.2.0 实际会装到哪个版本,那需要外部数据。
- 一次一个版本、一条区间:不批量、不排序、不做两两比较,也不给递增建议。
- 主 / 次 / 修订超出 JS 安全整数时只做标记并按字符串比较,不转成数值。
- 无网络、无存储、无历史、不进地址栏:刷新即清空,输入只存在于当前页面内存。
相关工具
同样只在浏览器本地运行的开发者小工具。