Feature Flags
Cargo features alternam dependências opcionais e caminhos de código #[cfg(feature = "...")].
Receita
[features]
default = ["std"]
std = []
json = ["dep:serde_json"]
[dependencies]
serde_json = { version = "1", optional = true }#[cfg(feature = "json")]
pub fn parse_json(s: &str) -> serde_json::Value {
serde_json::from_str(s).unwrap()
}Quando usar isso: Integrações opcionais, no_std, otimização em tempo de compilação.
Exemplo de Trabalho
#[cfg(feature = "async")]
pub mod async_api;
#[cfg(not(feature = "async"))]
pub mod sync_api;Compile apenas uma superfície de API por conjunto de features.
O que isso demonstra:
- O atributo
cfgcontrola módulos - Dependências opcionais vinculadas a features via
dep:nome(Cargo 1.60+) - Features padrão documentam compilações comuns
Mergulho Profundo
--no-default-features, --all-features para matriz de CI. Unificação de features em workspaces.
Armadilhas
- Renomeação de feature que quebra - Semver. Correção: Período de depreciação.
- feature = dep sem optional - Erro de manifesto. Correção:
optional = true. - cfg na API pública - Documentação difere por feature. Correção:
cargo doc --all-features. - Features implícitas removidas - Use
feature = ["dep:serde"]explícito. - Features mutuamente exclusivas - Documente; compilar ambas pode gerar erro.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Crates separados | Pilhas opcionais grandes | Flag pequena |
| Configuração em tempo de execução | Alternâncias do usuário em tempo de execução | Otimização em tempo de compilação necessária |
cfg(target_os) | Código de plataforma | Feature opcional do usuário |
FAQs
features fracas?
Encaminhamento de feature fraca de dependência.bin required-features?
[[bin]] required-features.test features?
dev-dependencies separadas.docs.rs all-features?
[package.metadata.docs.rs].no default?
default = [] minimalista.feature combinatorics?
Testar combinações comuns em CI.cfg macros?
crate cfg_if.rustflags cfg?
RUSTFLAGS --cfg custom.wasm features?
Features padrão menores.clippy cfg?
Atributos cfg respeitados.Relacionado
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.