版本的依賴關係

語意化的版本

在 Yarn 中的套件遵從語義化的版本,也稱為 “semver”。 當你安裝一個新的套件時,它會與一個符合 semver 的版本範圍一起被加入至你的 package.json 中。

這些版本號可以被分解為 major.minor.patch 這樣的格式,例如: 3.14.10.42.02.7.18。 各個部份將會在以下說明的時機遞增:

  • major 增加時意謂著你在套件中做了一個不相容的 API 修改時。
  • minor 增加時,意謂著你增加了相容過去版本新功能
  • patch 增加時,意謂著你修正了 bug **且相容過去版本**。

附註: 有時會附註 “標籤” 或是 “額外的資訊” 到 semver 上來標記如這是一個預發行版或測試版 (例: 2.0.0-Beta3)

當一個開發者說這兩個 semver 版本號是”完全相容”時,這意思是相容過去版本 (minorpatch)。

版本範圍

當你指定一個相依性時,你必須指定它的名字與一個版本範圍package.json 中,如下範例:

{
  "dependencies": {
    "package-1": ">=2.0.0 <3.1.4",
    "package-2": "^0.4.2",
    "package-3": "~2.7.1"
  }
}

相信你已注意到我們使用許多不同的字元在版本範圍中, 這些字元包括:>=<^~,稱之為運算子,它們被用來指定版本範圍

目的是為了指定符合哪些範圍的版本可以正常的運作在你的套件中。

比較運算子

每個版本範圍都會有一個比較運算子,這些比較運算子的格式是運算子加上版本號,以下是一些基本的運算子:

比較運算子 說明
<2.0.0 任何小於 2.0.0 的版本
<=3.1.4 任何小於等於 3.1.4 的版本
>0.4.2 任何大於 0.4.2 的版本
>=2.7.1 任何大於等於 2.7.1 的版本
=4.6.6 任何等於 4.6.6 的版本

附註:如果沒有指定任何運算子,則預設使用 =,所以 = 是可選的。

交集

比較運算子可以使用空白連接成一組比較運算子, 這會建立一個比較運算子的交集, 例如:>=2.0.0 <3.1.4意思是 “大於等於 2.0.0 小於 3.1.4

聯集

一個完整的版本範圍可以包含數個以||連接的比較運算子的聯集, 若聯集的任何一方被滿足了,則整個版本範圍都被滿足了, 例如:版本範圍 <2.0.0 || >3.1.4 意思是 “小於 2.0.0 大於3.1.4

預發佈標籤

版本號同時也可以有預發佈標籤 (如: 3.1.4-beta.2), 如果一個比較運算子包含了一個有預發佈標籤的版本,則它只會匹配同樣的 major.minor.patch 版本。

例如: 範圍 >=3.1.4-beta.2 會與 3.1.4-beta.23.1.4-beta.12 匹配,但不會3.1.5-beta.1 匹配,雖然它技術上而言“大於等於” (>=) 版本 3.1.4-beta.2

預發佈通常包含意料外的不相容,所以通常你不會希望去使用到其它的版本,因此這個行為是很有用的。

進階的版本範圍

連字號範圍

連字號範圍 (例如: 2.0.0-3.1.4) 指定一個 包含 的集合。如果省略版本的一部份 (例如 0.42) 省略的部份將用補 0。

版本範圍 展開結果
2.0.0 - 3.1.4 >=2.0.0 <=3.1.4
0.4 - 2 >=0.4.0 <=2.0.0
萬用字元

任何的 Xx,或者 * 在版本範圍中做為萬用字元使用。

版本範圍 展開結果
* >=0.0.0 (任何版本)
2.x >=2.0.0 <3.0.0 (匹配 major 版號)
3.1.x >=3.1.0 <3.2.0 (匹配 major 和 minor 版號)

如果版本號的一部份被省略,將會假定使用萬用字元。

版本範圍 展開結果
`` (empty string) *>=0.0.0
2 2.x.x>=2.0.0 <3.0.0
3.1 3.1.x>=3.1.0 <3.2.0
波浪號範圍

使用 ~ 使得 minor 版號必須相符而只允許 patch 不同,若在只有指定 major 版號時使用 ~ 則會允許 minor 不同。

版本範圍 展開結果
~3.1.4 >=3.1.4 <3.2.0
~3.1 3.1.x>=3.1.0 <3.2.0
~3 3.x>=3.0.0 <4.0.0

附註: 如果指定了預發佈的版號,則只會與該版號完全相符, 例如: 版本範圍為 ~3.1.4-beta.2 只會匹配 3.1.4-beta.43.1.5-beta.2 不會,因為 major.minor.patch 版號不同。

Caret 範圍

只允許至第一個非 0 的版號不同,比如在 3.1.4 中的 3 或在 0.4.2 中的 4

版本範圍 展開結果
^3.1.4 >=3.1.4 <4.0.0
^0.4.2 >=0.4.2 <0.5.0
^0.0.2 >=0.0.2 <0.0.3

附註: 預設情況下使用 yarn add [package-name] 會使用 caret 範圍。

如果版號的一部份被省略,省略的部份會自動補 0,然而它們的值仍然允許被改變。

版本範圍 展開結果
^0.0.x >=0.0.0 <0.1.0
^0.0 >=0.0.0 <0.1.0
^0.x >=0.0.0 <1.0.0
^0 >=0.0.0 <1.0.0

相關資源