为何main.rs无法访问dev-dependencies中的env_logger依赖?
解决方法
方法一:将示例代码移至examples/目录
Cargo默认会把dev-dependencies中的依赖用于examples/、tests/和benches/目录下的代码,完全符合你的需求:
- 在项目根目录创建
examples/文件夹,把原main.rs的内容迁移到examples/demo.rs中。 - 保持
Cargo.toml配置不变:
[dependencies] log = "0.4.22" [dev-dependencies] env_logger = "0.11.5"
- 运行示例的命令改为:
cargo run --example demo
这样env_logger只会在编译示例时被引入,不会成为库的传递依赖。
方法二:保留根目录main.rs,通过Cargo配置隔离依赖
如果不想移动文件,可以通过[[bin]]区块和条件编译实现:
- 修改
Cargo.toml,给根目录的二进制目标单独配置:
[dependencies] log = "0.4.22" [dev-dependencies] env_logger = "0.11.5" [[bin]] name = "your-crate-name" path = "main.rs" required-features = ["demo-log"] [features] # 定义仅用于开发/示例的feature demo-log = []
- 在
main.rs中用条件编译包裹日志初始化代码:
fn main() { #[cfg(feature = "demo-log")] { env_logger::builder().filter_level(log::LevelFilter::Debug).init(); } // 你的示例业务逻辑 }
- 运行时需要指定feature:
cargo run --features demo-log
用户使用你的库时不会自动启用demo-log feature,因此不会引入env_logger作为传递依赖。
补充说明
根目录的main.rs属于独立的二进制目标,默认不在dev-dependencies的作用范围内,这是你最初遇到错误的原因。第一种方法更符合Cargo的规范,配置简洁且便于管理多个示例,优先推荐。
内容的提问来源于stack exchange,提问作者workerjoe
相关产品推荐
相关产品推荐

