能否在Cargo.toml中为build依赖与dev依赖使用feature flags?
关于Cargo中为build-dependencies和dev-dependencies配置可选特性的疑问
我已经在Cargo.toml中用feature flags处理普通可选依赖,效果符合预期——未启用"bar"特性时会编译更少的crates,配置示例如下:
[features] bar = ["dep:foo"] [dependencies] foo = { version = "0.0.1", optional = true }
我希望以类似方式为可选的build-dependencies和dev-dependencies使用feature flags。我查阅了Cargo手册中Feature resolver version 2的章节,其中说明:
- Build-dependencies和proc-macros不与普通依赖共享特性。
- Dev-dependencies不会激活特性,除非构建需要它们的目标(如测试或示例)。
我不确定这些说明的含义,请问是否可以按以下方式进行可选编译?
[features] build-bar = ["dep:build-foo"] [build-dependencies] build-foo = { git = "https://github.com/Me/MyRepo", branch = "feat1", optional = true }
回答
你给出的build-dependencies配置是完全可行的:启用build-bar特性时,Cargo会拉取并编译build-foo这个构建依赖;不启用该特性时则会跳过它,完全符合你想要的可选编译效果。
针对你看到的手册说明,具体含义如下:
- Build-dependencies和proc-macros不与普通依赖共享特性:普通依赖的特性开关不会影响构建依赖,反之亦然。比如你给普通依赖
foo开启某个特性,不会自动同步到构建依赖里的同名 crate;构建依赖的特性配置也不会作用到普通依赖中的对应 crate,两者的特性空间完全隔离。 - Dev-dependencies不会激活特性,除非构建需要它们的目标:执行
cargo build仅编译主程序时,dev-dependencies相关的特性不会被触发;只有当你运行cargo test、cargo bench或构建示例这类需要用到dev-dependencies的命令时,对应的特性才会被激活。
另外补充dev-dependencies的可选配置方式,逻辑和普通依赖、build-dependencies一致:
[features] dev-bar = ["dep:dev-foo"] [dev-dependencies] dev-foo = { version = "0.0.1", optional = true }
运行cargo test --features dev-bar时会编译dev-foo这个开发依赖;如果不加--features dev-bar参数,则不会编译它。
内容的提问来源于stack exchange,提问作者NewToCode
相关产品推荐
相关产品推荐

