轉(zhuǎn)載自http://www.u396.com/semver-range.html
在使用Node.js和Bower的時(shí)候,其中的 package.json 和 bower.json 都會有dependencies、devDependencies 項(xiàng),對于此前端開發(fā)的童鞋應(yīng)該會比較熟悉。這里面是運(yùn)行時(shí)和開發(fā)時(shí)依賴庫,其中依賴庫對應(yīng)的版本號有很多種寫法,諸如:”~1.0.2
“, “^1.0“, “>=1.0.2“等,其實(shí)可以猜測這種寫法代表了某種范圍,至于具體含義本文給大家做詳細(xì)解釋。
語義化版本格式
我們首先簡單了解一下語義化版本版本號,標(biāo)準(zhǔn)的版本格式為:X.Y.Z,其中:
- X:主版本號,當(dāng)我們做了不兼容或者顛覆性的更新,修改此版本號。
- Y:此版本號,當(dāng)我們做了向下兼容的功能性修改,修改此版本號。
- Z:修訂號,當(dāng)我們做了向下兼容的問題修正,修改此版本號。
- 其中X、Y和Z必須為非負(fù)整數(shù),禁止數(shù)字前補(bǔ)零,每個(gè)數(shù)值都是遞增的。
語義化版本范圍
版本范圍是一組滿足指定范圍的比較器,一個(gè)比較器是由操作符和版本號組成,下面是最原始的操作符:
- < 小于;
- <= 小于等于;
- > 大于;
- >= 大于等于;
- = 等于;如果沒有指定操作符,則默認(rèn)為等于。
一個(gè)范圍可由一個(gè)或者多個(gè)比較器組成,如果有多個(gè),則由雙豎線(||)連接。對于包含多個(gè)比較器,只要滿足其一即可。比如:
- 范圍 >=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 不滿足。
關(guān)于測試版
Alpha、Beta、Gamma與α、β、λ諧音,是希臘字母前三個(gè)字母,用來表示軟件開發(fā)過程中測試的三個(gè)階段:
- Alpha:內(nèi)測版,內(nèi)部交流或者專業(yè)測試人員測試用;
- Beta:公測版,專業(yè)愛好者大規(guī)模測試用,存在一些缺陷,該版本也不適合一般用戶安裝;
- Gamma:比較成熟的測試版,與即將發(fā)行的正式版相差無幾;
- RC:是 Release Candidate 的縮寫,意思是發(fā)布倒計(jì)時(shí),候選版本,處于Gamma階段,該版本已經(jīng)完成全部功能并清除大部分的BUG。到了這個(gè)階段只會除BUG,不會對軟件做任何大的更改。從Alpha到Beta再到Gamma是改進(jìn)的先后關(guān)系,但RC1、RC2往往是取舍關(guān)系。
- Stable:穩(wěn)定版。在開源軟件中,都有stable版,這個(gè)就是開源軟件的穩(wěn)定發(fā)行版。
范圍 >1.2.3-alpha.3,版本1.2.3-alpha.7符合條件,而3.4.5-alpha.9卻不滿足條件。雖然 3.4.5-alpha.9 實(shí)際上大于 1.2.3-alpha.3,但是根據(jù) SemVer 的排序規(guī)則,這個(gè)版本范圍只是接受 1.2.3的測試版,而不接受其他版本的測試版。當(dāng)然 3.4.5 滿足條件,因?yàn)樗皇菧y試版,并且大于 1.2.3-alpha.7。
這么做是有兩個(gè)目的,首先測試版會經(jīng)常更新并且可能包含不適合公開的重大改動,因此被排除在范圍之外;再者,雖然用戶明確此次使用有風(fēng)險(xiǎn)的測試版本,然而下一版本的測試版被包含進(jìn)來仍然是不合適的。
版本范圍高級用法
在版本范圍的高級用法中,與原始的比較器不同,組合不僅僅限于空格和雙豎線,它有以下幾種方式。
連接符(-)范圍 X.Y.Z - A.B.C
下面表示的閉包集合
1.2.3 - 2.3.4 := >=1.2.3 <=2.3.4
如果范圍中的第一個(gè)版本號只有一部分,剩下的部分以零填充。
1.2 - 2.3.4 := >=1.2.0 <=2.3.4
如果范圍中的第二個(gè)版本號只有一部分,代表范圍中包含了這個(gè)版本。
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 或者 * 可以用在主版本號、此版本號以及修訂版本號的任何一個(gè)上面。
* := >=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的測試版本在范圍內(nèi),因此 1.2.3-beta.4
滿足條件,而1.2.4-beta.2不滿足條件。
補(bǔ)注號(^)范圍 ^1.2.3 ^0.2.5 ^0.0.4
允許在不修改[major, minor, patch]中最左非零數(shù)字的更改。換句話說,允許在 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