rust - 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.13
0.1.z
0.2.0
^1.0
1.1
1.y
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
, wherey ≥ z
和x > 0
。
我很困惑
在这种情况下,如果我们运行了,如果它是最新版本
cargo update -p time
,cargo 应该更新我们到版本,但不会更新我们到.0.1.13
0.1.z
0.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 是这样的?
解决方案
与 npm 不同,默认的版本要求范围确实是插入符要求!这在“指定依赖项”的货物参考中有所说明,就在问题中链接的部分之前。
该字符串
"0.1.12"
是 semver 版本要求。由于该字符串中没有任何运算符,因此它的解释方式与我们指定 的方式相同"^0.1.12"
,这称为插入符要求。
因此,以下两个依赖规范是等价的。
time = "0.1.12"
time = "^0.1.12"
顺便说一下,这是文档其余部分中提到的要求。的更新time
可能会带来高于 0.1.12 的版本,但绝不会带来 0.2.0 或更高的版本。
也可以看看:
推荐阅读
- swift - 使用带有 kAudioFilePropertyDataFormat 的 AudioFileGetProperty() 后发现可选值 nil
- php - 将字段添加到第三方包的现有 FormType 和实体
- javascript - 如何将变量值从javascript传递到perl
- r - glmmTMB 上的计划对比度
- c++ - 在 GDB 启动时禁用名称分解
- swift - Alamofire 和 responseJSONDecodable 具有 Dictionary 或 Array 类型
- html - 在指定的 div 中启用滚动?
- python - Pillow 不适用于 mac 上的 python 3
- haskell - 快速检查卡生成器
- python - 如何快速分配一个python dict链?