Rust语义化版本介绍

官方文档:https://semver.org/

在 Rust 中,Cargo.toml 中使用的版本号遵循 语义化版本(Semantic Versioning, SemVer),格式如下:

toml 复制代码
MAJOR.MINOR.PATCH
例如:1.2.3
tokio = { version = "1.0", features = ["full"] }

基本规则解释

部分 含义
MAJOR 主版本号:当你做了不兼容的 API 修改时,递增
MINOR 次版本号:当你做了向下兼容的功能性新增,递增
PATCH 补丁号:当你做了向下兼容的问题修正,一般是bug修改,递增。

Cargo 支持的版本范围语法

Rust 的 Cargo.toml 使用语义化版本规则的前缀语法来指定依赖的版本范围:

1. ^ ------ 默认行为(Caret requirement)

rust 复制代码
serde = "1.0.219"      # 等价于 ^1.0.219

含义:允许更新到不改变"最左侧非零数字"的任意新版本

写法 实际含义 范围说明
^1.2.3 >=1.2.3, <2.0.0 不会破坏 API 的更新
^0.3.1 >=0.3.1, <0.4.0 0.x 被视为不稳定
^0.0.5 >=0.0.5, <0.0.6 0.0.x 变化都可能破坏兼容性

👉 ^ 是 Cargo 的默认行为,用于保持向后兼容的同时接收非破坏性升级。

实例说明:

toml 复制代码
serde = "1.0"     # 等价于 ^1.0.0   → 允许 1.x.x(不包括 2.0)
serde = "0.3"     # 等价于 ^0.3.0   → 允许 0.3.x(不包括 0.4)
serde = "0.0.5"   # 等价于 ^0.0.5   → 只允许 0.0.5

特别注意:0.x 是不稳定的

0.x.y 版本被视为"未稳定",因此:

  • ^0.1.2 只允许 0.1.z不允许升级到 0.2.0
  • ^0.0.5 只允许 0.0.5,等价于锁定

2. ~ ------ Patch 限定(Tilde requirement)

rust 复制代码
serde = "~1.2.3"

含义:锁定 minor 版本,只允许 patch 升级

等价于:

rust 复制代码
>=1.2.3, <1.3.0

3. = ------精确版本

rust 复制代码
serde = "=1.2.3"

只允许使用 恰好 1.2.3 这个版本。即使最新版本是1.2.5,cargo update 命令也不会更新到最新版本。

4. 范围表达

rust 复制代码
serde = ">=1.0.0, <1.5.0"

直接通过数学符号表达版本范围。

5. 星号 *

rust 复制代码
serde = "*"

允许任何版本,默认拉取最新版本(不建议用于生产环境)。