语义版本校验

校验语义化版本号并解析区间。

什么才算版本号

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 哨兵用来排除下一个系列的先行版本。

npm 怎么补全局部版本
区间补全后
^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. 把 1.2.3-beta.1+build.5 这样的版本号粘进左框,边输入边出结果,没有任何需要点的按钮。
  2. 需要看区间时,把 ^1.2.0 这类 npm 区间粘进右框。
  3. 先看徽标:合不合法;不合法时是哪条规则、第几个字符。
  4. 想看 npm 的 includePrerelease 口径,勾选「包含先行版本」。
  5. 展开「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 安全整数时只做标记并按字符串比较,不转成数值。
  • 无网络、无存储、无历史、不进地址栏:刷新即清空,输入只存在于当前页面内存。

同样只在浏览器本地运行的开发者小工具。