【问题标题】:What does a caret version constraint mean in Rust Cargo?Rust Cargo 中的插入符号版本约束是什么意思?
【发布时间】: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.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.y0.x.z 兼容,其中 y ≥ zx &gt; 0

我很困惑

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

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

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

其中将&gt;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,其中通配符版本要求与 &gt;= {version} (等于或以后)比较版本要求。

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

【问题讨论】:

    标签: rust rust-cargo


    【解决方案1】:

    与 npm 不同,默认的版本要求范围确实是插入符要求!这在Cargo reference on "specifying dependencies" 中说明,就在问题中链接的部分之前。

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

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

    time = "0.1.12"
    
    time = "^0.1.12"
    

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

    另见:

    【讨论】:

    • 啊,当然 - 这解决了缺少的版本要求。示例 6 怎么样?
    • 这将是插入符号要求的另一个极端情况。它在您引用的文本中明确说明:“版本0.0.x 不被认为与任何其他版本兼容。”
    猜你喜欢
    • 2022-08-21
    • 2015-11-01
    • 2010-12-29
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多