Cargo: Feature Not Found — Como Resolver

Como resolver o erro 'feature not found' do Cargo no Rust. Aprenda sobre feature flags, como encontrar features disponíveis e configurar Cargo.toml corretamente.

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:

  1. Erro de digitação no nome da feature
  2. Feature renomeada em nova versão do crate
  3. Feature que não existe naquele crate
  4. 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/ – Documentacao
  • https://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

Veja Também