语义化版本号函数
某些版本方案易于解析和比较。Sprig 提供了用于处理语义化版本2的函数。
semver
semver
函数将字符串解析为语义化版本:
$version := semver "1.2.3-alpha.1+123"
如果解析器失败,将导致模板执行停止并显示错误信息。
此时,$version
是指向一个带有以下属性的Version
对象的指针:
$version.Major
:主要编号(上述为1
)$version.Minor
:次要编号(上述为2
)$version.Patch
:修订编号(上述为3
)$version.Prerelease
:预发布版本(上述为alpha.1
)$version.Metadata
:构建元数据(上述为123
)$version.Original
:原始版本,以字符串形式
此外,您可以使用Compare
方法将Version
与另一个version
进行比较:
semver "1.4.3" | (semver "1.2.3").Compare
上述语句将返回-1
。
返回值如下:
-1
:如果给定的语义化版本大于调用了Compare
方法的语义化版本1
:如果调用了Compare
函数的版本更大0
:如果它们是相同的版本
(注意,在语义化版本中,版本比较操作不会考虑Metadata
字段。)
semverCompare
提供了一个更强大的比较函数semverCompare
。该函数支持版本范围:
semverCompare "1.2.3" "1.2.3"
:检查是否完全匹配semverCompare "^1.2.0" "1.2.3"
:检查主要和次要版本是否匹配,并且第二个版本的修订编号大于或等于第一个参数。
语义化版本函数使用Masterminds semver库,由Sprig的开发者创建。
基本比较
比较有两个要素。首先,比较字符串是以空格或逗号分隔的 AND 比较的列表。然后,这些列表使用 ||(OR)比较分隔。例如,">= 1.2 < 3.0.0 || >= 4.2.3"
表示寻找大于或等于1.2且小于3.0.0,或大于或等于4.2.3的比较。
基本比较包括:
=
:等于(别名无运算符)!=
:不等于>
:大于<
:小于>=
:大于或等于<=
:小于或等于
注意,根据语义化版本规范,预发布版本可能与其发布版本不符合API兼容性。规范说,
处理预发布版本
对于那些不熟悉预发布版本的人来说,预发布版本用于稳定或普通可用版本之前的软件发布。预发布的示例包括开发版、alpha版、beta版和候选发布版。预发布可能是类似1.2.3-beta.1
的版本,而稳定版本则是1.2.3
。在顺序上,预发布版本位于其关联发布版本之前。例如,1.2.3-beta.1 < 1.2.3
。
根据语义化版本规范,预发布版本可能与其发布版本不符合 API 兼容性。规范说,
预发布版本表示该版本不稳定,可能无法满足其关联正常版本规定的兼容性要求。
使用约束条件进行 SemVer 比较时,如果没有预发布比较器,将跳过预发布版本。例如,当查看一系列发布版本时,>=1.2.3
将跳过预发布版本,而>=1.2.3-0
将计算并找到预发布版本。
在示例比较中,将0
作为预发布版本的原因是,根据规范,预发布版本只能包含ASCII字母数字字符和连字符(以及.
作为分隔符)。排序按照ASCII排序顺序进行,再次根据规范。ASCII 排序顺序中最小的字符是0
(请参阅ASCII表)。
了解 ASCII 排序顺序很重要,因为 A-Z 在 a-z 之前。这意味着>=1.2.3-BETA
将返回1.2.3-alpha
。您可能对大小写敏感性的期望在这里不适用。这是由于 ASCII 排序顺序规范指定的。
比较中使用连字符 -
有多种方法可以处理范围,其中一种是连字符范围。它们的格式如下:
1.2 - 1.4.5
:等同于>= 1.2 <= 1.4.5
2.3.4 - 4.5
:等同于>= 2.3.4 <= 4.5
比较中使用通配符 *
x
、X
和*
字符可以用作通配符。这适用于所有比较运算符。当在=
运算符上使用时,它会回退到修订级别的比较(参见下面的波浪线)。例如,
1.2.x
等同于>= 1.2.0, < 1.3.0
>= 1.2.x
等同于>= 1.2.0
<= 2.x
等同于< 3
*
等同于>= 0.0.0
比较中使用波浪线 ~
(修订版本号)
波浪线~
比较运算符用于修订级别范围,如果指定了次要版本,则用于主要级别更改。例如,
~1.2.3
等同于>= 1.2.3, < 1.3.0
~1
等同于>= 1, < 2
~2.3
等同于>= 2.3, < 2.4
~1.2.x
等同于>= 1.2.0, < 1.3.0
~1.x
等同于>= 1, < 2
比较中使用抑扬符 ^
(主版本号)
抑扬符^
比较运算符用于主要级别更改,一旦发生稳定(1.0.0)版本的发布。在1.0.0版本发布之前,次要版本充当API稳定级别。在比较 API 版本时,这非常有用,因为主版本号更改会破坏 API。例如,
^1.2.3
等同于>= 1.2.3, < 2.0.0
^1.2.x
等同于>= 1.2.0, < 2.0.0
^2.3
等同于>= 2.3, < 3
^2.x
等同于>= 2.0.0, < 3
^0.2.3
等同于>=0.2.3 <0.3.0
^0.2
等同于>=0.2.0 <0.3.0
^0.0.3
等同于>=0.0.3 <0.0.4
^0.0
等同于>=0.0.0 <0.1.0
^0
等同于>=0.0.0 <1.0.0