檢視原始碼 版本 (Elixir v1.16.2)
用於分析和比對版本與需求的函式。
版本是特定格式的字串,或透過 Version.parse/1
分析後產生的 Version
。
雖然 Elixir 專案不需要遵循 SemVer,但必須遵循 SemVer 2.0 架構 中概述的格式。
版本
簡而言之,版本由三個數字表示
MAJOR.MINOR.PATCH
預發行版本支援在修補版本之後,選擇性附加連字號和一系列以句點分隔的識別碼。識別碼僅包含 ASCII 字母數字字元和連字號 ([0-9A-Za-z-]
)
"1.0.0-alpha.3"
可以在修補版本或預發行版本之後,附加加號和一系列以句點分隔的識別碼,加入組建資訊。識別碼僅包含 ASCII 字母數字字元和連字號 ([0-9A-Za-z-]
)
"1.0.0-alpha.3+20130417140000.amd64"
需求
需求讓您可以指定願意使用的特定依賴項版本。需求支援常見的比較運算子,例如 >
、>=
、<
、<=
和 ==
,這些運算子的運作方式符合預期,此外還有下方詳細說明的特殊運算子 ~>
。
# Only version 2.0.0
"== 2.0.0"
# Anything later than 2.0.0
"> 2.0.0"
需求也支援 and
和 or
,用於複雜的條件
# 2.0.0 and later until 2.1.0
">= 2.0.0 and < 2.1.0"
由於上述範例是非常常見的需求,因此可以表示為
"~> 2.0.0"
~>
永遠不會包含其上限的預發行版本,無論是否使用 :allow_pre
選項,或者運算元是否為預發行版本。它也可以用於僅設定主版本部分的上限。請參閱下表,了解 ~>
需求及其對應的轉換。
~> | 翻譯 |
---|---|
~> 2.0.0 | >= 2.0.0 且 < 2.1.0 |
~> 2.1.2 | >= 2.1.2 且 < 2.2.0 |
~> 2.1.3-dev | >= 2.1.3-dev 且 < 2.2.0 |
~> 2.0 | >= 2.0.0 且 < 3.0.0 |
~> 2.1 | >= 2.1.0 且 < 3.0.0 |
在 ~>
之後的需求運算元允許省略修補程式版本,讓我們可以表示 ~> 2.1
或 ~> 2.1-dev
,這是使用一般比較運算元時不允許的。
當 :allow_pre
選項在 Version.match?/3
中設定為 false
時,除非運算元是預先發布版本,否則需求不會符合預先發布版本。預設值是總是允許預先發布,但請注意在 Hex 中,:allow_pre
設定為 false
。請參閱下表以取得範例。
需求 | 版本 | :allow_pre | 符合 |
---|---|---|---|
~> 2.0 | 2.1.0 | true 或 false | true |
~> 2.0 | 3.0.0 | true 或 false | false |
~> 2.0.0 | 2.0.5 | true 或 false | true |
~> 2.0.0 | 2.1.0 | true 或 false | false |
~> 2.1.2 | 2.1.6-dev | true | true |
~> 2.1.2 | 2.1.6-dev | false | false |
~> 2.1-dev | 2.2.0-dev | true 或 false | true |
~> 2.1.2-dev | 2.1.6-dev | true 或 false | true |
>= 2.1.0 | 2.2.0-dev | true | true |
>= 2.1.0 | 2.2.0-dev | false | false |
>= 2.1.0-dev | 2.2.6-dev | true 或 false | true |
摘要
函式
Version 結構。
比較兩個版本。
將需求編譯成內部表示,這可能會最佳化比對。
檢查指定的版本是否符合規範。
將版本字串剖析成 Version
結構。
將版本字串剖析成 Version
。
將版本需求字串剖析成 Version.Requirement
結構。
將版本需求字串剖析成 Version.Requirement
結構。
將指定的版本轉換成字串。
類型
@type build() :: String.t() | nil
@type major() :: non_neg_integer()
@type minor() :: non_neg_integer()
@type patch() :: non_neg_integer()
@type pre() :: [String.t() | non_neg_integer()]
@type requirement() :: String.t() | Version.Requirement.t()
函式
Version 結構。
它包含欄位 :major
、:minor
、:patch
、:pre
和 :build
,根據 SemVer 2.0,其中 :pre
是清單。
您可以讀取這些欄位,但您不應透過 struct 語法直接建立新的 Version
。請改用此模組中的函式。
比較兩個版本。
如果第一個版本大於第二個版本,則傳回 :gt
,反之則傳回 :lt
。如果兩個版本相等,則傳回 :eq
。
預先發布版本絕對小於其對應的發布版本。
如果補丁區段是字母數字,則以字元順序比較;否則以數字比較。
忽略建置區段:如果兩個版本僅在建置區段不同,則視為相等。
如果兩個給定的版本中任一個無法解析,則會引發 Version.InvalidVersionError
例外。如果給定已解析的版本,此函式不會引發例外。
範例
iex> Version.compare("2.0.1-alpha1", "2.0.0")
:gt
iex> Version.compare("1.0.0-beta", "1.0.0-rc1")
:lt
iex> Version.compare("1.0.0-10", "1.0.0-2")
:gt
iex> Version.compare("2.0.1+build0", "2.0.1")
:eq
iex> Version.compare("invalid", "2.0.1")
** (Version.InvalidVersionError) invalid version: "invalid"
@spec compile_requirement(Version.Requirement.t()) :: Version.Requirement.t()
將需求編譯成內部表示,這可能會最佳化比對。
內部表示法是不透明的。
@spec match?(version(), requirement(), keyword()) :: boolean()
檢查指定的版本是否符合規範。
如果 version
符合 requirement
,則傳回 true
,否則傳回 false
。如果 requirement
無法解析,則會引發 Version.InvalidRequirementError
例外;如果 version
無法解析,則會引發 Version.InvalidVersionError
例外。如果給定已解析的版本和需求,此函式不會引發例外。
選項
:allow_pre
(布林值) - 當false
時,預先發布版本不會相符,除非運算元是預先發布版本。預設為true
。有關範例,請參閱上表「需求」區段。
範例
iex> Version.match?("2.0.0", "> 1.0.0")
true
iex> Version.match?("2.0.0", "== 1.0.0")
false
iex> Version.match?("2.1.6-dev", "~> 2.1.2")
true
iex> Version.match?("2.1.6-dev", "~> 2.1.2", allow_pre: false)
false
iex> Version.match?("foo", "== 1.0.0")
** (Version.InvalidVersionError) invalid version: "foo"
iex> Version.match?("2.0.0", "== == 1.0.0")
** (Version.InvalidRequirementError) invalid requirement: "== == 1.0.0"
將版本字串剖析成 Version
結構。
範例
iex> Version.parse("2.0.1-alpha1")
{:ok, %Version{major: 2, minor: 0, patch: 1, pre: ["alpha1"]}}
iex> Version.parse("2.0-alpha1")
:error
將版本字串剖析成 Version
。
如果 字串
是無效版本,會引發 Version.InvalidVersionError
。
範例
iex> Version.parse!("2.0.1-alpha1")
%Version{major: 2, minor: 0, patch: 1, pre: ["alpha1"]}
iex> Version.parse!("2.0-alpha1")
** (Version.InvalidVersionError) invalid version: "2.0-alpha1"
@spec parse_requirement(String.t()) :: {:ok, Version.Requirement.t()} | :error
將版本需求字串剖析成 Version.Requirement
結構。
範例
iex> {:ok, requirement} = Version.parse_requirement("== 2.0.1")
iex> requirement
Version.parse_requirement!("== 2.0.1")
iex> Version.parse_requirement("== == 2.0.1")
:error
@spec parse_requirement!(String.t()) :: Version.Requirement.t()
將版本需求字串剖析成 Version.Requirement
結構。
如果 字串
是無效需求,會引發 Version.InvalidRequirementError
。
範例
iex> Version.parse_requirement!("== 2.0.1")
Version.parse_requirement!("== 2.0.1")
iex> Version.parse_requirement!("== == 2.0.1")
** (Version.InvalidRequirementError) invalid requirement: "== == 2.0.1"
將指定的版本轉換成字串。
範例
iex> Version.to_string(%Version{major: 1, minor: 2, patch: 3})
"1.2.3"
iex> Version.to_string(Version.parse!("1.14.0-rc.0+build0"))
"1.14.0-rc.0+build0"