轉自 http://www.u396.com/semver-range.html
在使用 Node.js
和 Bower
的時候,其中的 package.json
和 bower.json
都會有 dependencies
、devDependencies
項,對於此前端開 發的童鞋應該會比較熟悉。這裏面是運行時和開發時依賴庫,其中依賴庫對應的版本號有很多種寫法,諸如:”~1.0.2“
, “^1.0“
, “>=1.0.2“
等,其實可以猜測這種寫法代表了某種範圍,至於具體含義本文給大家做詳細解釋。
語義化版本格式
我們首先簡單瞭解一下語義化版本版本號,標準的版本格式爲:X.Y.Z
,其中:
X
:主版本號,當我們做了不兼容或者顛覆性的更新,修改此版本號。Y
:此版本號,當我們做了向下兼容的功能性修改,修改此版本號。Z
:修訂號,當我們做了向下兼容的問題修正,修改此版本號。
其中X
、Y
和Z
必須爲非負整數,禁止數字前補零,每個數值都是遞增的。
標題語義化版本範圍
版本範圍是一組滿足指定範圍的比較器,一個比較器是由操作符和版本號組成,下面是最原始的操作符:
-
<
小於; -
<=
小於等於; -
>
大於; -
>=
大於等於; -
=
等於;如果沒有指定操作符,則默認爲等於。
一個範圍可由一個或者多個比較器組成,如果有多個,則由雙豎線(||)連接。對於包含多個比較器,只要滿足其一即可。比如: -
範圍
>=1.2.7 <1.3.0
,版本號1.2.7
,1.2.8
,1.2.99
滿足條件,而1.2.6
,1.3.0
,1.1.0
確不滿足。 -
範圍
1.2.7 || >=1.2.9 <2.0.0
,版本號1.2.7
,1.2.9
,1.4.6
滿足,而1.2.8
或者2.0.0
不滿足。
標題關於測試版
Alpha
、Beta
、Gamma
與α
、β
、λ
諧音,是希臘字母前三個字母,用來表示軟件開發過程中測試的三個階段:
Alpha
:內測版,內部交流或者專業測試人員測試用;Beta
:公測版,專業愛好者大規模測試用,存在一些缺陷,該版本也不適合一般用戶安裝;Gamma
:比較成熟的測試版,與即將發行的正式版相差無幾;RC
:是Release Candidate
的縮寫,意思是發佈倒計時,候選版本,處於Gamma階段,該版本已經完成全部功能並清除大部分的BUG
。到了這個階段只會除BUG
,不會對軟件做任何大的更改。從Alpha
到Beta
再到Gamma
是改進的先後關係,但RC1
、RC2
往往是取捨關係。Stable
:穩定版。在開源軟件中,都有stable
版,這個就是開源軟件的穩定發行版。
範圍>1.2.3-alpha.3
,版本1.2.3-alpha.7
符合條件,而3.4.5-alpha.9
卻不滿足條件。雖然 3.4.5-alpha.9
實際上大於 1.2.3-alpha.3
,但是根據 SemVer
的排序規則,這個版本範圍只是接受 1.2.3
的測試版,而不接受其他版本的測試版。當然 3.4.5
滿足條件,因爲它不是測試版,並且大於 1.2.3-alpha.7
。
這麼做是有兩個目的,首先測試版會經常更新並且可能包含不適合公開的重大改動,因此被排除在範圍之外;
再者,雖然用戶明確此次使用有風險的測試版本,然而下一版本的測試版被包含進來仍然是不合適的。
標題版本範圍高級用法
在版本範圍的高級用法中,與原始的比較器不同,組合不僅僅限於空格和雙豎線,它有以下幾種方式。
連接符(-)範圍 X.Y.Z - A.B.C
下面表示的閉包集合
-
1.2.3 - 2.3.4 := >=1.2.3 <=2.3.4
如果範圍中的第一個版本號只有一部分,剩下的部分以零填充。 -
1.2 - 2.3.4 := >=1.2.0 <=2.3.4
如果範圍中的第二個版本號只有一部分,代表範圍中包含了這個版本。 -
1.2.3 - 2.3 := >=1.2.3 <2.4.0
-
1.2.3 - 2 := >=1.2.3 <3.0.0
X範圍 1.2.x 1.X 1.2.* *
X
, x
或者 *
可以用在主版本號、此版本號以及修訂版本號的任何一個上面。
-* := >=0.0.0 (任何版本都滿足)
1.x := >=1.0.0 <2.0.0 (只要滿足主版本號即可)
1.2.x := >=1.2.0 <1.3.0 (需要滿足主版本和此版本號)
部分版本號的含義與X
範圍表示含義一樣,所以X或者*
都是可以省略的。
-"" (空字符串) := * := >=0.0.0
1 := 1.x.x := >=1.0.0 <2.0.0
1.2 := 1.2.x := >=1.2.0 <1.3.0
波浪線(~)範圍 ~1.2.3 ~1.2 ~1
~1.2.3 := >=1.2.3 <1.(2+1).0 := >=1.2.3 <1.3.0
~1.2 := >=1.2.0 <1.(2+1).0 := >=1.2.0 <1.3.0 (類似於 1.2.x)
~1 := >=1.0.0 <(1+1).0.0 := >=1.0.0 <2.0.0 (類似於 1.x)
~0.2.3 := >=0.2.3 <0.(2+1).0 := >=0.2.3 <0.3.0
~0.2 := >=0.2.0 <0.(2+1).0 := >=0.2.0 <0.3.0 (類似於 0.2.x)
~0 := >=0.0.0 <(0+1).0.0 := >=0.0.0 <1.0.0 (類似於 0.x)
~1.2.3-beta.2 := >=1.2.3-beta.2 <1.3.0
注意版本爲1.2.3
且大於等於beta.2
的測試版本在範圍內,因此1.2.3-beta.4
滿足條件,而1.2.4-beta.2
不滿足條件。
補註號(^)範圍 ^1.2.3 ^0.2.5 ^0.0.4
允許在不修改[major, minor, patch]
中最左非零數字的更改。換句話說,允許在 1.0.0
及以上版本對次版本號和修訂版本號的更新,允許在 0.1.0
以及以上版本對修訂版本號更新,版本爲 0.0.X
不允許更新。
^1.2.3 := >=1.2.3 <2.0.0
^0.2.3 := >=0.2.3 <0.3.0
^0.0.3 := >=0.0.3 <0.0.4
^1.2.3-beta.2 := >=1.2.3-beta.2 <2.0.0
^0.0.3-beta := >=0.0.3-beta <0.0.4
-^1.2.x := >=1.2.0 <2.0.0
^0.0.x := >=0.0.0 <0.1.0
^0.0 := >=0.0.0 <0.1.0
^1.x := >=1.0.0 <2.0.0
^0.x := >=0.0.0 <1.0.0