Версия
Функции для разбора и сопоставления версий с требованиями.
Версия — это строка в определенном формате или Version, сгенерированная после разбора с помощью Version.parse/1.
Version разбор и требования следуют схеме SemVer 2.0.
Версии
Вкратце, версия представлена тремя числами:
MAJOR.MINOR.PATCH
Предварительные версии поддерживаются путем добавления -[0-9A-Za-z-\.]:
"1.0.0-alpha.3"
Дополнительную информацию о сборке можно добавить, добавив +[0-9A-Za-z-\.]:
"1.0.0-alpha.3+20130417140000"
Структура
Версия представлена структурой Version, и поля называются в соответствии со схемой SemVer: :major, :minor, :patch, :pre, и :build.
Требования
Требования позволяют указать, с какими версиями конкретной зависимости вы готовы работать. Требования поддерживают стандартные операторы, такие как >=, <=, >, ==, и аналогичные, которые работают так, как ожидается:
# 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"
~> никогда не будет включать предварительные версии верхней границы. Его также можно использовать для задания верхней границы только для основной части версии. В таблице ниже приведены ~> требования и их соответствие.
~> |
Перевод |
|---|---|
~> 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 |
Когда allow_pre: false установлен, требование не будет соответствовать предварительной версии, если операнд не является предварительной версией. По умолчанию предварительные версии всегда разрешены, но обратите внимание, что в Hex :allow_pre установлено в значение false. В таблице ниже приведены примеры.
| Требование | Версия | :allow_pre |
Соответствует |
|---|---|---|---|
~> 2.0 |
2.1.0 |
- | true |
~> 2.0 |
3.0.0 |
- | false |
~> 2.0.0 |
2.0.1 |
- | true |
~> 2.0.0 |
2.1.0 |
- | false |
~> 2.1.2 |
2.1.3-dev |
true |
true |
~> 2.1.2 |
2.1.3-dev |
false |
false |
~> 2.1-dev |
2.2.0-dev |
false |
true |
~> 2.1.2-dev |
2.1.3-dev |
false |
true |
>= 2.1.0 |
2.2.0-dev |
false |
false |
>= 2.1.0-dev |
2.2.3-dev |
true |
true |
Обзор
Типы
- build()
- major()
- matchable()
- minor()
- patch()
- pre()
- requirement()
- t()
- version()
Функции
- compare(version1, version2)
-
Сравнивает две версии
- compile_requirement(req)
-
Компилирует требование до его внутренней формы с использованием
:ets.match_spec_compile/1для более быстрого сопоставления - match?(version, requirement, opts \\ [])
-
Проверяет, соответствует ли заданная версия спецификации
- parse(string)
-
Разбирает строку версии в структуру
Version - parse!(string)
-
Разбирает строку версии в
Version - parse_requirement(string)
-
Разбирает строку требования версии в структуру
Version.Requirement
Типы
build()
build() :: String.t() | nil
major()
major() :: String.t() | non_neg_integer()
matchable()
matchable() ::
{major :: major(), minor :: minor(), patch :: patch(), pre :: pre()} minor()
minor() :: non_neg_integer() | nil
patch()
patch() :: non_neg_integer() | nil
pre()
pre() :: [String.t() | non_neg_integer()]
requirement()
requirement() :: String.t() | Version.Requirement.t()
t()
t() :: %Version{
build: build(),
major: major(),
minor: minor(),
patch: patch(),
pre: pre()
} version()
version() :: String.t() | t()
Функции
compare(version1, version2)
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(req)
compile_requirement(Version.Requirement.t()) :: Version.Requirement.t()
Компилирует требование до его внутренней формы с использованием :ets.match_spec_compile/1 для более быстрого сопоставления.
Внутренняя форма является неявной и не может быть преобразована в формат внешнего термина и обратно без потери свойств (т.е. ее нельзя отправить процессу на другом узле и она все равно останется допустимой compiled match_spec, также ее нельзя сохранить на диске).
match?(version, requirement, opts \\ [])
match?(version(), requirement(), keyword()) :: boolean()
Проверяет, соответствует ли заданная версия спецификации.
Возвращает true , если version удовлетворяет requirement, false в противном случае. Возбуждает исключение Version.InvalidRequirementError, если requirement не может быть обработана, или исключение Version.InvalidVersionError, если version не может быть обработана. Если даны уже обработанная версия и требование, эта функция не будет вызывать исключение.
Параметры
-
: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?("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" parse(string)
parse(String.t()) :: {:ok, t()} | :error Парсит строку версии в структуру Version.
Примеры
iex> {:ok, version} = Version.parse("2.0.1-alpha1")
iex> version
#Version<2.0.1-alpha1>
iex> Version.parse("2.0-alpha1")
:error parse!(string)
parse!(String.t()) :: t() | no_return()
Парсит строку версии в Version.
Если string является недопустимой версией, генерируется InvalidVersionError.
Примеры
iex> Version.parse!("2.0.1-alpha1")
#Version<2.0.1-alpha1>
iex> Version.parse!("2.0-alpha1")
** (Version.InvalidVersionError) invalid version: "2.0-alpha1" parse_requirement(string)
parse_requirement(String.t()) :: {:ok, Version.Requirement.t()} | :error Парсит строку требования версии в структуру Version.Requirement.
Примеры
iex> {:ok, requirement} = Version.parse_requirement("== 2.0.1")
iex> requirement
#Version.Requirement<== 2.0.1>
iex> Version.parse_requirement("== == 2.0.1")
:error
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.6.6/Version.html