我正在实现 Rust Cargo 版本要求。一般来说,我很难理解指定的插入符要求。我发现package.json 中的 tilde(~) 和 caret(^) 有什么区别?,但是这个问题是关于 npm 版本要求的,我不确定它是否与 Rust Cargo 版本要求相同。
\n在https://doc.rust-lang.org/cargo/reference/specifying-dependency.html#caret-requirements,我读到:
\n\n\nCaret 要求允许 SemVer 兼容更新到指定版本。如果新版本号不修改主要、次要、补丁分组中最左边的非零数字,则允许更新。在这种情况下,如果我们运行,如果是最新版本,
\ncargo update -p timecargo 应该将我们更新到版本,但不会将我们更新到。相反,如果我们将版本字符串指定为,则货物应该更新为(如果它是最新版本),而不是。该版本不被视为与任何其他版本兼容。0.1.130.1.z0.2.0^1.01.11.y2.00.0.x
\n\n以下是插入符要求及其允许的版本的更多示例:
\n
\n\nRun Code Online (Sandbox Code Playgroud)\n^1.2.3 := >=1.2.3, <2.0.0\n^1.2 := >=1.2.0, <2.0.0\n^1 := >=1.0.0, <2.0.0\n^0.2.3 := >=0.2.3, <0.3.0\n^0.2 := >=0.2.0, <0.3.0\n^0.0.3 := >=0.0.3, <0.0.4\n^0.0 := >=0.0.0, <0.1.0\n^0 := >=0.0.0, <1.0.0\n此兼容性约定与 SemVer 的不同之处在于它对待之前版本的方式
\n1.0.0。虽然 SemVer 之前表示不兼容1.0.0,但 Cargo 认为0.x.y可以兼容0.x.z, wherey \xe2\x89\xa5 z和x > 0。
我很困惑
\n\n\n在这种情况下,如果我们运行,如果是最新版本,
\ncargo update -p timecargo 应该将我们更新到版本,但不会将我们更新到。0.1.130.1.z0.2.0
这是什么版本要求?似乎被排除在句子之外。它继续引用看似缺失的插入符号版本要求:
\n\n\n相反,如果我们将版本字符串指定为
\n^1.0,则货物应该更新为1.1(如果它是最新1.y版本),而不是2.0。
其中它指的>1.0是版本字符串(我在前面的句子中错过了)。
如果我剖析这些例子,我的推理如下:
\n^1.2.3 := >=1.2.3, <2.0.0 // same as >=1.2.3 AND 1.*\n^1.2 := >=1.2.0, <2.0.0 // same as >=1.2 AND 1.*, which condenses into 1.2.*\n^1 := >=1.0.0, <2.0.0 // same as 1.*\n^0.2.3 := >=0.2.3, <0.3.0 // same as >=0.2.3 AND 0.2.*\n^0.2 := >=0.2.0, <0.3.0 // same as 0.2.*, which condenses into 0.2.*\n^0.0.3 := >=0.0.3, <0.0.4 // huh\n^0.0 := >=0.0.0, <0.1.0 // same as >=0.0.0 AND 0.0.*\n^0 := >=0.0.0, <1.0.0 // same as >=0.0.0 AND 0.*, which condenses into 0.*\nRun Code Online (Sandbox Code Playgroud)\n因此,除了我对第 6 个示例 ( ^0.0.3) 的理解之外,我的结论是脱字符号版本要求与通配符版本要求完全相同,除非指定 PATCH,其中通配符版本要求 AND 与>= {version}(等于或稍后)比较版本要求。
这种理解是否正确?为什么示例 6 是这样的?
\n与 npm 不同,默认版本要求范围确实是插入符号要求!这在Cargo 参考中关于“指定依赖项”的说明中,就在问题中链接的部分之前。
该字符串
"0.1.12"是 semver 版本要求。由于该字符串中没有任何运算符,因此它的解释方式与我们指定的方式相同"^0.1.12",这称为插入符要求。
因此,以下两个依赖性规范是等效的。
time = "0.1.12"
Run Code Online (Sandbox Code Playgroud)
time = "^0.1.12"
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这是文档其余部分提到的要求。的更新time可能会带来高于 0.1.12 的版本,但绝不会带来 0.2.0 或更高版本。
也可以看看: