Cargo: Feature Not Found
O erro “feature not found” ocorre quando você especifica uma feature flag no Cargo.toml que não existe no crate. Features no Rust são um mecanismo de compilação condicional que permite ativar ou desativar funcionalidades opcionais de uma dependência.
A Mensagem de Erro
error: failed to select a version for `serde`.
... required by package `meu-projeto v0.1.0`
versions that meet the requirements `^1` are: 1.0.197, ...
the package `meu-projeto` depends on `serde`, with features: `derivar` did you mean `derive`?
Outra variação:
error: Package `tokio v1.36.0` does not have feature `todas`. It has the following features:
bytes, fs, io-std, io-util, libc, macros, mio, net, parking_lot, process, ...
O Que Significa
Feature flags são funcionalidades opcionais que um crate pode oferecer. Elas permitem:
- Reduzir o tempo de compilação (só compila o que você precisa)
- Reduzir o tamanho do binário
- Evitar dependências desnecessárias
- Oferecer APIs opcionais
Quando você especifica uma feature que não existe no crate, o Cargo não sabe o que ativar e reporta o erro. As causas comuns são:
- Erro de digitação no nome da feature
- Feature renomeada em nova versão do crate
- Feature que não existe naquele crate
- Confusão entre crates — a feature pertence a outro crate
Código com Erro
# Cargo.toml
[dependencies]
# ERRO: "derivar" não existe — o correto é "derive"
serde = { version = "1", features = ["derivar"] }
# ERRO: "todas" não existe — o correto é "full"
tokio = { version = "1", features = ["todas"] }
# ERRO: "json" não é feature do serde, e sim do serde_json
serde = { version = "1", features = ["json"] }
Como Resolver
Solução 1: Verificar o Nome Correto da Feature
Consulte a documentação do crate para ver as features disponíveis:
# Ver features disponíveis via cargo
cargo add serde --dry-run
# Ou consulte o Cargo.toml do crate no repositório/docs.rs
Corrija os nomes:
[dependencies]
# Nomes corretos
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }
reqwest = { version = "0.12", features = ["json", "rustls-tls"] }
Solução 2: Consultar docs.rs ou crates.io
Cada crate no docs.rs lista suas features. Acesse:
https://docs.rs/nome-do-crate/latest/– Documentacaohttps://crates.io/crates/nome-do-crate– Pagina do crate
No crates.io, as features aparecem na seção “Feature flags” da página do crate.
Solução 3: Usar cargo add com Features
O cargo add facilita adicionar dependências com features corretas:
# Adicionar com features específicas
cargo add tokio --features rt-multi-thread,macros,io-util
# Adicionar com todas as features
cargo add tokio --features full
# Ver features disponíveis
cargo add tokio --dry-run
Solução 4: Verificar o Cargo.toml do Crate
Veja o Cargo.toml do crate diretamente no repositório GitHub. A seção [features] lista todas as features disponíveis:
# Exemplo: Cargo.toml do tokio
[features]
default = []
full = ["fs", "io-util", "io-std", "macros", "net", "parking_lot",
"process", "rt", "rt-multi-thread", "signal", "sync", "time"]
fs = []
io-util = ["bytes"]
macros = ["tokio-macros"]
net = ["libc", "mio/net", "socket2"]
rt = []
rt-multi-thread = ["rt"]
# ...
Features Comuns dos Crates Mais Populares
serde
serde = { version = "1", features = ["derive"] }
# Features: derive, alloc, rc, unstable
tokio
tokio = { version = "1", features = ["full"] }
# Ou selecione apenas o que precisa:
tokio = { version = "1", features = ["rt-multi-thread", "macros", "net", "io-util"] }
# Features: bytes, fs, full, io-std, io-util, macros, net, parking_lot,
# process, rt, rt-multi-thread, signal, sync, time, test-util
reqwest
reqwest = { version = "0.12", features = ["json", "rustls-tls"] }
# Features: blocking, cookies, default-tls, gzip, json, multipart,
# native-tls, rustls-tls, stream
sqlx
sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }
# Features: runtime-tokio-native-tls, runtime-tokio-rustls,
# runtime-async-std-native-tls, runtime-async-std-rustls,
# postgres, mysql, sqlite, any, macros, migrate
clap
clap = { version = "4", features = ["derive"] }
# Features: cargo, color, derive, env, error-context, help, std,
# string, suggestions, unicode, usage, wrap_help
Definindo Suas Próprias Features
No seu Cargo.toml:
[features]
default = ["json"] # Features ativadas por padrão
json = ["dep:serde_json"] # Ativa dependência opcional
logging = ["dep:log", "dep:env_logger"]
testes-integracao = []
[dependencies]
serde_json = { version = "1", optional = true }
log = { version = "0.4", optional = true }
env_logger = { version = "0.11", optional = true }
Uso no código:
#[cfg(feature = "json")]
pub mod json_parser {
use serde_json::Value;
pub fn parsear(texto: &str) -> serde_json::Result<Value> {
serde_json::from_str(texto)
}
}
#[cfg(feature = "logging")]
pub fn iniciar_log() {
env_logger::init();
}
Compilando com Features Específicas
# Compilar sem features default
cargo build --no-default-features
# Compilar com features específicas
cargo build --features "json,logging"
# Compilar com todas as features
cargo build --all-features