当某个功能被禁用时,如何从编译中排除某个 crate?

问题描述 投票:0回答:1

我有一个遵循以下结构的 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
 作为依赖项?

rust rust-cargo
1个回答
0
投票
正在编译板条箱,因为在工作区中,Cargo 默认构建所有包。

您可以使用

cargo build --package <package>

 (
cargo build -p <package>
) 仅构建特定包(及其依赖项),或者通过 
cargo build
为所有
workspace.default-members
设置默认包。

© www.soinside.com 2019 - 2024. All rights reserved.