插入符号版本约束在Rust Cargo中意味着什么



我正在实现Rust Cargo版本要求。通常,我很难理解指定的插入符号要求。我发现了What';json包中波浪号(~(和插入符号(^(的区别是什么?,但这个问题是关于npm版本要求的,我不确定它是否与Rust Cargo版本要求相同。

在https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#caret-要求,我读到:

Caret要求允许将SemVer兼容更新到指定版本。如果新版本号未修改主、次修补程序分组中最左边的非零数字,则允许进行更新。在这种情况下,如果我们运行cargo update -p time,如果它是最新的0.1.z版本,那么cargo应该将我们更新到版本0.1.13,但不会将我们更新为0.2.0。如果我们将版本字符串指定为^1.0,那么如果它是最新的1.y版本,而不是2.0,那么cargo应该更新为1.10.0.x版本被认为与任何其他版本都不兼容。

以下是插入符号要求的更多示例以及允许使用它们的版本:

<blockquote\
^1.2.3  :=  >=1.2.3, <2.0.0
^1.2    :=  >=1.2.0, <2.0.0
^1      :=  >=1.0.0, <2.0.0
^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

>此兼容性约定与SemVer在处理1.0.0之前的版本方面有所不同。虽然SemVer表示1.0.0之前没有兼容性,但Cargo认为0.x.y0.x.z兼容,其中y ≥ zx > 0

我对感到困惑

在这种情况下,如果我们运行cargo update -p time,如果它是最新的0.1.z版本,cargo应该将我们更新到0.1.13版本,但不会将我们更新为0.2.0

这种情况下的版本要求是什么?这句话似乎没有提到。它继续提到一个看似缺失的插入符号版本要求:

如果我们将版本字符串指定为^1.0,那么如果它是最新的1.y版本,而不是2.0,那么货物应该更新为1.1

其中它引用>1.0作为版本字符串(我在前面的句子中遗漏了它(。

如果我仔细分析这些例子,我的推理如下:

^1.2.3  :=  >=1.2.3, <2.0.0 // same as >=1.2.3 AND 1.*
^1.2    :=  >=1.2.0, <2.0.0 // same as >=1.2 AND 1.*, which condenses into 1.2.*
^1      :=  >=1.0.0, <2.0.0 // same as 1.*
^0.2.3  :=  >=0.2.3, <0.3.0 // same as >=0.2.3 AND 0.2.*
^0.2    :=  >=0.2.0, <0.3.0 // same as 0.2.*, which condenses into 0.2.*
^0.0.3  :=  >=0.0.3, <0.0.4 // huh
^0.0    :=  >=0.0.0, <0.1.0 // same as >=0.0.0 AND 0.0.*
^0      :=  >=0.0.0, <1.0.0 // same as >=0.0.0 AND 0.*, which condenses into 0.*

因此,除了我对第六个示例(^0.0.3(的理解之外,我的结论是插入符号版本要求与通配符版本要求完全相同,除非指定了PATCH,其中通配符版本要求与>= {version}(等于或更晚(比较版本要求进行AND。

这种理解正确吗?为什么示例6是这样?

与npm不同,默认版本要求范围实际上是插入符号要求!这在货物参考号";指定依赖性";,就在问题中链接的部分之前。

字符串"0.1.12"是semver版本要求。由于这个字符串中没有任何运算符,所以它的解释方式与我们指定的"^0.1.12"相同,这被称为插入符号要求。

因此,以下两个依赖项规范是等效的。

time = "0.1.12"
time = "^0.1.12"

顺便说一句,这就是本文件其余部分提到的要求。time的更新可能会带来高于0.1.12的版本,但永远不会带来0.2.0或更高的版本。

另请参阅:

  • 如何指定依赖项的确切版本

最新更新