外观
第 8 节:依赖管理与选库
前面七节用的库,都是"别人的玩具"。这一节讲怎么用好"别人的玩具":版本号怎么看、依赖怎么更新、锁文件是什么、以及最重要的——怎么判断一个库值不值得用。
版本号:语义化版本 ⭐
Rust 生态统一用语义化版本(semver):主版本.次版本.补丁版本。
text
serde = "1.0.229"
│ │ └─ 补丁:修 bug,向后兼容,放心更新
│ └──── 次版本:加功能,仍向后兼容,放心更新
└─────── 主版本:可能有破坏性变更,升级要谨慎Cargo.toml 里写的 "1" 表示"1.x 的最新"——写 "1.0" 就是"1.0.x 的最新",范围更窄。主版本不同的库(1.x 和 2.x)是"不同的库",可能 API 全变。
cargo 命令全家 ⭐
bash
cargo add serde --features derive # 加依赖(自动选最新版)
cargo add serde@1.0.229 # 加指定版本
cargo remove serde # 删依赖
cargo update # 按版本范围更新依赖(更新 Cargo.lock)
cargo update -p serde # 只更新某一个
cargo tree # 看依赖树(谁依赖了谁)Cargo.lock:依赖的"锁" ⭐
Cargo.lock 记录了所有依赖的精确版本:
- 应用(binary):
Cargo.lock要提交到 Git——保证大家、CI、生产环境用的版本完全一致 - 库(library):
Cargo.lock不提交(库的用户决定版本)——所以库的Cargo.toml用"1"这种宽范围
经验
"昨天还能编译,今天不行了"——多半是 cargo update 把某个依赖升级了。应用项目里 Cargo.lock 锁住一切,想升级才 cargo update。
选库:五个信号 ⭐
看到一个新库,拿不准用不用?五连问:
- 下载量/使用量:
docs.rs或 crates.io 页面看"最近下载量"——大下载量说明被广泛使用、踩过的坑都有人踩过了 - 维护状态:最近一次发布是什么时候?一年没更新的库,谨慎(除非它已经成熟稳定)
- 依赖是否克制:一个"打日志"的库拖进来 50 个依赖?警惕(第 6 章:依赖会放大风险)
- Rust 版本兼容:
rust-version字段(要求的最低 Rust 版本)——你的工具链太老会编译不过 - 许可证:
license字段——商用项目要注意(AGENTS:安全第一)
辅助工具:
常见误用与坑
- 主版本升级当普通更新:1.x → 2.x 的
cargo update后 API 大改——升级前先读迁移指南,升级后跑测试 - 依赖爆炸:
cargo tree看看有没有"一个库带 50 个库"——能接受再引入 - 忘记锁文件:库项目里
gitignore排除了Cargo.lock是对的;应用项目里提交锁文件,CI 才稳定 cargo add不带 features:很多库的默认 features 不是你要的(第 1 节 serde 的derive、第 6 节 tokio 的macros)——cargo add tokio --features macros是标配姿势- 国内镜像:本书环境用的是 rsproxy 镜像(
~/.cargo/config.toml里的replace-with配置)——正常,不影响开发;发布/CI 环境记得用官方源
最后一课
前两卷教你"写代码",这一卷教你"用代码"。真实项目 = 20% 自己写 + 80% 站在别人的肩膀上。选对库、锁住版本、读懂 API 文档——这三样本事,比背一百个方法名都值钱。