Cargo.toml中[dependencies]与[dev-dependencies]的区别及使用疑问
Cargo.toml中[dependencies]与[dev-dependencies]的区别
核心差异
- [dependencies]:服务于项目的主业务代码(
src/目录下的所有代码),是编译、运行项目必须的依赖。这些依赖会被包含在最终发布的二进制文件或库中,且会传递给引用当前项目的下游依赖。 - [dev-dependencies]:仅在开发环节生效,不会进入最终发布产物,也不会传递给下游。它的生效范围仅限:测试代码(
tests/目录)、示例代码(examples/目录)、基准测试(benches/目录),以及编译项目文档时。
你遇到的报错解析
当你将uuid放在dev-dependencies下时:
[package] # ... 省略其他配置 ... [dependencies] # 未声明uuid [dev-dependencies] uuid = "1.0.0"
在主代码src/main.rs中引用uuid:
use uuid::Uuid; fn main() { println!("Hello, world!"); }
Cargo会抛出错误:
error[E0432]: unresolved import `uuid` --> src/main.rs:1:5 | 1 | use uuid::Uuid; | ^^^^ use of undeclared crate or module `uuid`
原因很简单:主代码不属于dev-dependencies的生效范围,Cargo不会为它加载dev下的依赖。而把uuid移到[dependencies]后,主代码就能正常识别这个 crate 了。
dev-dependencies的典型适用场景
- 测试类工具:比如
rstest、proptest这类仅在编写测试用例时需要的框架 - 代码质量工具:像
clippy(代码检查)、rustfmt(代码格式化)这类开发辅助工具 - 示例代码依赖:项目
examples/目录下的演示代码用到的第三方包,放在这里不会增加主依赖的体积 - 文档生成辅助:用于生成或优化项目文档的工具,比如帮助渲染文档示例的 crate
- 基准测试库:比如
criterion这类专门做性能基准测试的工具
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

