語義版本校驗
校驗語義化版本號並解析區間。
版本解析
- 主版本號 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 安全整數時只做標記並按字串比較,不轉成數值。
- 無網路、無儲存、無歷史、不進位址列:重新整理即清空,輸入只存在於當前頁面記憶體。
相關工具
同樣只在瀏覽器本地執行的開發者小工具。