在 Rust 的 Cargo.toml 文件中,[features] 部分允许你定义可选的特性(features),这些特性可以用来控制编译哪些代码或依赖项。特性可以用于许多场景,比如为库提供不同的编译选项,或者为二进制程序提供不同的功能集。
基本语法
在 Cargo.toml 中,你可以这样定义特性:
[features]
default = ["feature1"] # 默认启用的特性
feature1 = [] # 一个空的特性,可以用来控制代码中的条件编译
feature2 = ["dep/feature"] # 启用依赖项中的某个特性
代码示例
假设你有一个库,它可以选择性地支持某个功能(比如日志记录)。你可以使用特性来控制这个功能是否被编译进去。
Cargo.toml
[package]
name = "mylib"
version = "0.1.0"
edition = "2021"
[features]
default = [] # 没有默认启用的特性
logging = [] # 定义一个名为“logging”的特性
[dependencies]
log = { version = "0.4", optional = true } # 可选的依赖项
lib.rs
在库的代码中,你可以使用 #[cfg(feature = "logging")] 属性来控制哪些代码块仅在启用了特定特性时才被编译。
#[cfg(feature = "logging")]
extern crate log;
pub fn do_something() {
// ... 执行一些操作 ...
#[cfg(feature = "logging")]
{
log::info!("do_something was called"); // 仅当启用了“logging”特性时,这行代码才会被编译和执行
}
}
使用特性
当其他项目或二进制程序依赖你的库时,它们可以在自己的 Cargo.toml 文件中通过特性来控制你的库的编译选项。
其他项目的 Cargo.toml
[dependencies]
mylib = { version = "0.1", features = ["logging"] } # 启用“logging”特性
或者,如果它们不想启用日志记录功能,只需省略 features 字段即可:
[dependencies]
mylib = "0.1" # 不启用任何特性,因此日志记录功能将不会被编译进去
总结
- 特性(features)允许你定义可选的编译选项。
- 你可以在
Cargo.toml的[features]部分定义特性。 - 使用
#[cfg(feature = "name")]属性在代码中控制条件编译。 - 依赖项可以通过在其自己的
Cargo.toml文件中指定特性来控制你的库的编译选项。