查看源代码 版本 (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 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.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.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()

函数

版本结构体。

它包含字段 :major:minor:patch:pre:build,根据 SemVer 2.0,其中 :pre 是一个列表。

您可以读取这些字段,但您不应该通过结构体语法直接创建新的 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

如果 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"
链接到此函数

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 结构体。

如果 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"
链接到此函数

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"