查看源代码 版本 (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 and < 2.1.0 |
~> 2.1.2 | >= 2.1.2 and < 2.2.0 |
~> 2.1.3-dev | >= 2.1.3-dev and < 2.2.0 |
~> 2.0 | >= 2.0.0 and < 3.0.0 |
~> 2.1 | >= 2.1.0 and < 3.0.0 |
在 ~>
之后的运算符允许省略修订版本,允许我们表达 ~> 2.1
或 ~> 2.1-dev
,这在使用常见的比较运算符时是不允许的。
当 Version.match?/3
中的 :allow_pre
选项设置为 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.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()
函数
版本结构体。
它包含字段 :major
、:minor
、:patch
、:pre
和 :build
,根据 SemVer 2.0,其中 :pre
是一个列表。
您可以读取这些字段,但您不应该通过结构体语法直接创建新的 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
。
如果 string
是无效的版本,则会引发 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
结构体。
如果 string
是无效的需求,则会引发 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"