Skip to content

语义化版本号函数

某些版本方案易于解析和比较。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

比较中使用通配符 *

xX*字符可以用作通配符。这适用于所有比较运算符。当在=运算符上使用时,它会回退到修订级别的比较(参见下面的波浪线)。例如,

  • 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