我有一个遵循以下结构的 Rust 项目:
- main_crate (features = "x")
- driver_crate (features = "x")
- x_crate
...
...
在我的
main_crate
中,我有一个默认启用的功能标志x
,它通过driver_crate
中的以下设置传播到main_crate/Cargo.toml
:
[features]
x = ["driver-crate/x"]
# default = ["x"]
driver_crate/Cargo.toml
通过以下方式将 x
依赖项指定为可选:
[dependencies]
x-crate = { path = "../x-crate", optional = true }
[features]
x = ["dep:x-crate"]
假设我运行
cargo build --no-default-features
,我的期望是现在 x
不再默认启用,Cargo 现在应该将 x
依赖项视为 false
,因此甚至不尝试将其编译为项目。相反,cargo 仍然添加 x_crate
作为编译过程的一部分。
此外,当我执行以下命令时,我验证了“x”板条箱不在“依赖项”树中:
cargo tree -p main_crate | grep "x_crate"
然而,当我专门启用
x
时,它就会出现:
cargo tree -p main_crate -F "x" | grep "x_crate"
│ │ ├── x_crate v0.1.0 (/src/x_crate)
当未指定功能
x_crate
时,有没有办法确保x
根本不被编译?
更新:我意识到为什么它包含在汇编中。我的项目使用虚拟清单,指定工作区的 members
是
src/*
,它自动包含
x
:
[workspace]
members = [
"src/*",
当我向工作区指定 x_crate
功能标志时,如何动态包含/排除
x
作为依赖项?
您可以使用
cargo build --package <package>
(
cargo build -p <package>
) 仅构建特定包(及其依赖项),或者通过
cargo build
为所有 workspace.default-members
设置默认包。