語義版本校驗

校驗語義化版本號並解析區間。

什麼才算版本號

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 安全整數時只做標記並按字串比較,不轉成數值。
  • 無網路、無儲存、無歷史、不進位址列:重新整理即清空,輸入只存在於當前頁面記憶體。

同樣只在瀏覽器本地執行的開發者小工具。