首页 > 解决方案 > 为什么 Rust 的 Cargo 不认为 0.8.3 版本具有与 0.9.0 版本兼容的 API?

问题描述

我正在读Rust 书。特别是关于 Cargo 使用的语义版本控制的这一部分。

真正没有意义的是:

数字 0.8.3 实际上是 ^0.8.3 的简写,这意味着任何版本至少为 0.8.3 但低于 0.9.0。Cargo 认为这些版本具有与 0.8.3 版本兼容的公共 API,并且该规范确保您将获得仍将与本章中的代码一起编译的最新补丁版本。不保证任何 0.9.0 或更高版本都具有与以下示例使用的 API 相同的 API。

根据语义版本控制规则,次要版本(从0.8.30.9.0)的更改不能包含破坏公共 API 的更改。为什么 Cargo 认为这 2 个版本的公共 API 可能不兼容?是不是因为主版本正好是0?如果我们正在处理主要版本> 0(例如)的情况,1.8.3那么指定允许 Cargo 安装版本吗?1.8.3Cargo.toml1.9.0

标签: rustrust-cargo

解决方案


如 The Cargo Book 的Specifying Dependencies一章中所述(强调添加):

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

插入符号要求

Caret 要求允许 SemVer 兼容更新到指定版本。如果新版本号没有修改主要、次要、补丁分组中最左边的非零数字,则允许更新。

[...]

此兼容性约定与 SemVer 的不同之处在于它处理 1.0.0 之前的版本的方式。虽然 SemVer 表示 1.0.0 之前没有兼容性,但 Cargo 认为0.x.y0.x.z、 wherey ≥ zx > 0.


推荐阅读