版本说明符由一系列版本语句组成,以逗号分隔。例如:
~= 0.9, >= 1.0, != 1.3.4.*, < 2.0
版本语句中运算符类型描述:
~=
:兼容发布版本==
:精准匹配版本!=
:需要排除的版本<=, >=
: 包含大于/小于该版本的内容<, >
:不包含且大于/小于该版本的内容===
:任意平等。逗号(“,”)相当于逻辑与运算符:候选版本必须匹配所有给定的版本子句才能成功安装。
条件运算符和以下版本标识符之间的空格是可选的,逗号周围的空格也是可选的。
当多个候选版本与版本说明符匹配时,首选版本应该是由标准版本方案定义的一致排序确定的最新版本。无论预发行版是否被视为候选版本,都应该按照预发行版处理中的描述进行处理。
除非下面特别指出,否则版本说明符中不得允许使用本地版本标识符,并且在检查候选版本是否与给定版本说明符匹配时必须完全忽略本地版本标签。
兼容发布子句由兼容发布运算符~= 和版本标识符组成。它匹配任何预期与指定版本兼容的候选版本。
指定的版本标识符必须采用 版本方案中描述的标准格式。此版本说明符中不允许使用本地版本标识符。
对于给定的发布标识符V.N,兼容的发布子句大约相当于一对比较子句:
>= V.N, == V.*
该运算符不得与单段版本号一起使用,例如 ~=1
.
例如,以下几组版本子句是等效的:
~= 2.2
>= 2.2, == 2.*
~= 1.4.5
>= 1.4.5, == 1.4.*
如果预发布、后发布或开发版本在兼容发布子句中命名为V.N.suffix,则在确定所需的前缀匹配时将忽略后缀:
~= 2.2.post3
>= 2.2.post3, == 2.*
~= 1.4.5a4
>= 1.4.5a4, == 1.4.*
发布段比较的填充规则意味着兼容发布子句中假定的前向兼容性程度可以通过向版本说明符附加额外的零来控制:
~= 2.2.0
>= 2.2.0, == 2.2.*
~= 1.4.5.0
>= 1.4.5.0, == 1.4.5.*
版本匹配子句包括版本匹配运算符==
和版本标识符。
指定的版本标识符必须采用 版本方案中描述的标准格式,但允许在公共版本标识符上使用尾随.*
,如下所述。
默认情况下,版本匹配运算符基于严格的相等比较:指定的版本必须与请求的版本完全相同。执行的唯一替换是释放段的零填充,以确保释放段与相同的长度进行比较。
严格版本匹配是否合适取决于版本说明符的具体用例。当严格版本匹配使用不当时,自动化工具至少应该发出警告,并且可以完全拒绝它们。
.*
通过将尾部附加到版本匹配子句中的版本标识符,可以请求前缀匹配而不是严格比较。这意味着在确定版本标识符是否与子句匹配时,将忽略附加的尾随段。如果指定的版本仅包含发布段,则发布段中的尾随组件(或缺少尾随组件)也将被忽略。
例如,给定 version 1.1.post1,以下子句将匹配或不匹配,如下所示:
== 1.1 # 不匹配
== 1.1.post1 # 匹配
== 1.1.* # 相同前缀,匹配
出于前缀匹配的目的,预发段被认为具有隐含的前置.,因此给定 version 1.1a1,以下子句将匹配或不匹配,如下所示:
== 1.1 # 不匹配
== 1.1a1 # 匹配
== 1.1.* # 前缀相同,因此如果请求预发布,1.1a1与子句匹配
精确匹配也被视为前缀匹配(这种解释是由版本标识符的发布段的通常零填充规则暗示的)。给定 version 1.1,以下子句将匹配或不匹配,如下所示:
== 1.1 # 匹配
== 1.1.0 # 零填充将1.1扩展到1.1.0,因此它与子句匹配
== 1.1.dev1 # 不匹配
== 1.1a1 # 不匹配
== 1.1.post1 # 不匹配
== 1.1.* # 匹配
1.0.dev1.*
因为包含开发或本地版本(例如1.0+foo1.*
)的前缀匹配是无效的。如果存在,则开发版本段始终是公共版本中的最终段,并且出于比较目的而忽略本地版本,因此在前缀匹配中使用任何一个都没有任何意义。
强烈建议不要在定义已发布发行版的依赖项时使用==
(至少不带通配符后缀),因为这会使安全修复程序的部署变得非常复杂。严格版本比较运算符主要用于在使用共享分发索引时定义应用程序可重复部署的依赖项时使用。
如果指定的版本标识符是公共版本标识符(无本地版本标签),则在匹配版本时必须忽略任何候选版本的本地版本标签。
如果指定的版本标识符是本地版本标识符,则在匹配版本时必须考虑候选版本的本地版本标签,如上所述匹配公共版本标识符,并使用严格字符串检查本地版本标签是否等效平等比较。
版本排除子句包括版本排除运算符!=
和版本标识符。
允许的版本标识符和比较语义与Version 匹配运算符的相同,只是任何匹配的含义都是相反的。
例如,给定 version 1.1.post1,以下子句将匹配或不匹配,如下所示:
!= 1.1 # 不相等,因此1.1.post1与子句匹配
!= 1.1.post1 # 匹配
!= 1.1.* # 前缀相同,因此1.1.post1与子句不匹配
包容性有序比较子句包括比较运算符和版本标识符,并且根据标准版本方案定义的一致排序,根据候选版本和指定版本的相对位置,将匹配比较正确的任何 版本。
包含的有序比较运算符是<=
和>=
。
与版本匹配一样,版本段根据需要进行零填充,以确保版本段具有相同的长度进行比较。
此版本说明符中不允许使用本地版本标识符。
~=3.1
:版本 3.1 或更高版本,但不是版本 4.0 或更高版本。~=3.1.2
:版本 3.1.2 或更高版本,但不是版本 3.2.0 或更高版本。~=3.1a1
:版本 3.1a1 或更高版本,但不是版本 4.0 或更高版本。== 3.1
:特别是版本 3.1(或 3.1.0),不包括所有预发行版、后期发行版、开发发行版和任何 3.1.x 维护发行版。== 3.1.*
:以 3.1 开头的任何版本。~=3.1.0, != 3.1.3
:版本 3.1.0 或更高版本,但不是版本 3.1.3,也不是版本 3.2.0 或更高版本。