我正在实现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.1
。0.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.y
与0.x.z
兼容,其中y ≥ z
和x > 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或更高的版本。
另请参阅:
- 如何指定依赖项的确切版本