(done) Cargo 详解,Cargo.toml vs Cargo.lock

张开发
2026/4/9 8:43:31 15 分钟阅读

分享文章

(done) Cargo 详解,Cargo.toml vs Cargo.lock
url1: https://www.bilibili.com/video/BV1X3rYBEEVe/?vd_source7a1a0bc74158c6993c7355c5490fc600url2: https://doc.rust-lang.org/cargo/guide/index.htmlCargo 是什么RUST 包管理工具用来管理依赖保证精准、高效地管理依赖。也可以是项目管理工具。Cargo 创建项目/packagecdworkspace# 创建二进制可执行文件项目cargonew hello_world--bin# 或者# 创建 library 项目cargonew hello_world--lib创建出来的项目天生可编译可运行可测试相当于 cargo 给的一个模版项目名字不一定要用 hello_world任意名字都行但里面的程序是固定的比如cargonew try_another_name--bin生成的项目功能照样是打印 “hello world”下面是编译运行项目的全面命令cdworkspacecargonew hello_world--bincdhello_worldcargobuild ./target/debug/hello_world# 显示Hello, world!或者cdworkspacecargonew hello_world--bincdhello_worldcargorun# 显示Hello, world!此时目录下会多一个 Cargo.lock 文件这玩意儿在运行 cargo build 后自动生成。现在不关心这个东西因为我们的 Cargo.toml 里还没有依赖。默认情况下cargo build/run 编译的是 DEBUG 版本它编译更快但运行更慢。调试完毕后可以编译 Release 版本它会添加很多优化编译更慢但运行更快cargobuild--release使用已存在的 Cargo 包/packagecdworkspacegitclone https://github.com/rust-lang/regex.gitcdregexcargobuildCargo 添加下载依赖主流的 cargo 包位于https://crates.io/这玩意儿类似于 dockerhub, pip, apt。通常使用 Cargo.toml 管理依赖。创建一个新项目cdworkspacecargonew hello_world--bincdhello_worldcargobuild可以看到 Cargo.toml 和 Cargo.lock 都特别无聊# Cargo.toml [package] name hello_world version 0.1.0 edition 2024 [dependencies] # Cargo.lock # This file is automatically generated by Cargo. # It is not intended for manual editing. version 4 [[package]] name hello_world version 0.1.0往 Cargo.toml 里添加依赖如下[package] name hello_world version 0.1.0 edition 2024 [dependencies] time 0.1.12 regex 0.1.41运行cargo build运行完毕后可以看到 Cargo.lock 明显有趣了起来多了很多内容。阅读 Cargo.lock可以发现 time 的版本是 “0.1.45”regex 版本是 “0.1.80”。并不完全是 Cargo.toml 定义的版本。这是因为下面这种 time “0.1.12” 的写法本身就是模糊写法它的真正含义是time 的版本需要 0.1.12 0.2。[dependencies] time 0.1.12 regex 0.1.41如果需要精准锁定某个版本的包需要写[dependencies] time 0.1.12 regex 0.1.41但不一定能编译通过因为包太老某些依赖可能已经被废弃 (yanked)比如我们现在编译就会报错Cargo 包布局不细讲看这个 https://doc.rust-lang.org/cargo/guide/project-layout.htmlCargo.toml vs Cargo.lockurl: https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html这里只记录新概念。Cargo.toml 还可以用 github repo 的方式提供包[package] name hello_world version 0.1.0 [dependencies] regex { git https://github.com/rust-lang/regex.git }上面这种写法默认 clone 最新的 commit这有一个问题每个用户不同时间 cargo build拉取的 regex 版本可能不一样可以明确版本[dependencies] regex { git https://github.com/rust-lang/regex.git, rev 9f9f693 }但更合适的固定版本方法是用自动生成的 Cargo.lock。每次 git commit 把 Cargo.lock 提交上去用户下载下来,cargo build时cargo 会优先读取 Cargo.lock 里明确的版本号从而保证各用户下载的依赖版本一致。但你打算更新依赖版本更新 Cargo.lock 时运行下面的命令$cargoupdate# updates all dependencies$cargoupdate regex# updates just “regex”

更多文章