檢視原始碼 版本 (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"

需求也支援 andor,用於複雜的條件

# 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.02.1.0truefalsetrue
~> 2.03.0.0truefalsefalse
~> 2.0.02.0.5truefalsetrue
~> 2.0.02.1.0truefalsefalse
~> 2.1.22.1.6-devtruetrue
~> 2.1.22.1.6-devfalsefalse
~> 2.1-dev2.2.0-devtruefalsetrue
~> 2.1.2-dev2.1.6-devtruefalsetrue
>= 2.1.02.2.0-devtruetrue
>= 2.1.02.2.0-devfalsefalse
>= 2.1.0-dev2.2.6-devtruefalsetrue

摘要

函式

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()
@type t() :: %Version{
  build: build(),
  major: major(),
  minor: minor(),
  patch: patch(),
  pre: pre()
}
@type version() :: String.t() | t()

函式

Version 結構。

它包含欄位 :major:minor:patch:pre:build,根據 SemVer 2.0,其中 :pre 是清單。

您可以讀取這些欄位,但您不應透過 struct 語法直接建立新的 Version。請改用此模組中的函式。

連結到此函式

compare(version1, version2)

檢視原始碼
@spec compare(version(), version()) :: :gt | :eq | :lt

比較兩個版本。

如果第一個版本大於第二個版本,則傳回 :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"
連結到此函式

compile_requirement(requirement)

檢視原始碼
@spec compile_requirement(Version.Requirement.t()) :: Version.Requirement.t()

將需求編譯成內部表示,這可能會最佳化比對。

內部表示法是不透明的。

連結到此函式

match?(version, requirement, opts \\ [])

檢視原始碼
@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"
@spec parse(String.t()) :: {:ok, t()} | :error

將版本字串剖析成 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
@spec parse!(String.t()) :: t()

將版本字串剖析成 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"
連結到此函式

parse_requirement(string)

檢視原始碼
@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
連結到此函式

parse_requirement!(string)

檢視原始碼 (自 1.8.0 起)
@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"
連結到此函式

to_string(version)

檢視原始碼 (自 1.14.0 起)
@spec to_string(t()) :: String.t()

將指定的版本轉換成字串。

範例

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"