首页 > 解决方案 > Rust Cargo 中的插入符号版本约束是什么意思?

问题描述

我正在实施 Rust Cargo 版本要求。一般来说,我很难理解指定的插入符号要求。我发现package.json 中的波浪号(~)和插入符号(^)有什么区别?,但是这个问题是关于 npm 版本要求的,我不确定它是否与 Rust Cargo 版本要求相同。

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

Caret 要求允许 SemVer 兼容更新到指定版本。如果新版本号没有修改主要、次要、补丁分组中最左边的非零数字,则允许更新。在这种情况下,如果我们运行了,如果它是最新版本cargo update -p time,cargo 应该更新我们到版本,但不会更新我们到. 相反,如果我们将版本字符串指定为,则 cargo 应该更新为最新版本,但不是。该版本不被视为与任何其他版本兼容。0.1.130.1.z0.2.0^1.01.11.y2.00.0.x

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

^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, wherey ≥ zx > 0

我很困惑

在这种情况下,如果我们运行了,如果它是最新版本cargo update -p time,cargo 应该更新我们到版本,但不会更新我们到.0.1.130.1.z0.2.0

这种情况是什么版本要求?它似乎被排除在句子之外。它继续引用看似缺失的插入符号版本要求:

相反,如果我们将版本字符串指定为^1.0,则 cargo 应该更新为1.1最新1.y版本,但不是2.0

其中它被>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因此,除了我对第 6 个示例>= {version}

这种理解是否正确,为什么示例 6 是这样的?

标签: rustrust-cargo

解决方案


与 npm 不同,默认的版本要求范围确实是插入符要求!这在“指定依赖项”的货物参考中有所说明,就在问题中链接的部分之前。

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

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

time = "0.1.12"
time = "^0.1.12"

顺便说一下,这是文档其余部分中提到的要求。的更新time可能会带来高于 0.1.12 的版本,但绝不会带来 0.2.0 或更高的版本。

也可以看看:


推荐阅读