【发布时间】:2021-04-12 16:28:04
【问题描述】:
我正在实施 Rust Cargo 版本要求。一般来说,我很难理解指定的插入符要求。我找到了What's the difference between tilde(~) and caret(^) in package.json?,但这个问题是关于 npm 版本要求的,我不确定它是否与 Rust Cargo 版本要求相同。
在https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#caret-requirements,我读到:
插入符要求允许将 SemVer 兼容更新到指定版本。如果新版本号没有修改主要、次要、补丁分组中最左边的非零数字,则允许更新。在这种情况下,如果我们运行
cargo update -p time,如果它是最新的0.1.z版本,cargo 应该更新我们到版本0.1.13,但不会更新我们到0.2.0。相反,如果我们将版本字符串指定为^1.0,那么如果它是最新的1.y版本,cargo 应该更新为1.1,而不是2.0。0.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兼容,其中y ≥ z和x > 0。
我很困惑
在这种情况下,如果我们运行
cargo update -p time,如果它是最新的0.1.z版本,cargo 应该更新我们到版本0.1.13,但不会更新我们到0.2.0。
这种情况是什么版本要求?它似乎被排除在句子之外。它继续引用看似缺失的插入符号版本要求:
如果我们将版本字符串指定为
^1.0,那么如果它是最新的1.y版本,cargo 应该更新为1.1,而不是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.*
因此,除了我对第 6 个示例 (^0.0.3) 的理解之外,我的结论是插入符号版本要求与通配符版本要求完全相同,除非指定 PATCH,其中通配符版本要求与 >= {version} (等于或以后)比较版本要求。
这种理解正确吗?为什么是示例 6?
【问题讨论】:
标签: rust rust-cargo