Melhores Práticas Essenciais de Crates
Um resumo conciso de hábitos de dependência que mantêm codebases Rust rápidas para construir, seguras para atualizar e fáceis de onboardar.
Busque em todas as páginas da documentação
Um resumo conciso de hábitos de dependência que mantêm codebases Rust rápidas para construir, seguras para atualizar e fáceis de onboardar.
Use serde + um crate de formato como padrão: serde nas fronteiras; adicione serde_json ou toml apenas onde necessário. Evite serde_json::Value no núcleo do domínio.
Padronize em Tokio para IO async: Misturar runtimes multiplica bugs. Faça a ponte do log legado com tracing-log.
Separe erros por função do crate: thiserror em bibliotecas, anyhow em binários. Nunca vaze anyhow::Error de crates publicados.
Reutilize clientes HTTP e de DB: Um reqwest::Client e um sqlx::PgPool por processo via LazyLock ou estado Axum.
Escolha chrono ou time, não ambos: Documente a escolha no README do workspace e aplique na revisão.
Use clap derive para CLIs voltadas ao usuário: Nomes de flags estáveis; adicione aliases antes de remover flags antigas.
Alcance rayon apenas acima de limites: Paralelismo tem overhead; faça benchmark de entradas pequenas primeiro.
Prefira LazyLock a static mut customizado: Em Rust 1.80+, statics lazy do std reduzem a superfície do once_cell.
DashMap é um cache, não um banco de dados: Adicione evicção e persista o estado autoritativo em outro lugar.
Habilite recursos TLS rustls por padrão: OpenSSL apenas quando a plataforma ou conformidade exigir.
Execute cargo deny check em CI: Portões de licença, aviso e versão duplicada capturam risco de cadeia de suprimentos precocemente.
Leia exemplos do docs.rs antes de adotar: Crates com exemplos executáveis envelhecem melhor que projetos apenas com README.
Minimize flags de recursos em crates pesados: tokio = { features = ["rt-multi-thread", "macros", "time"] } supera full quando o tamanho importa.
Mantenha as versões de dependência do workspace unificadas: [workspace.dependencies] no Cargo.toml raiz evita divisões de versão.
Commite Cargo.lock para binários: Bibliotecas podem omitir; aplicações e serviços implantáveis devem travar.
Registre MSRV em Cargo.toml: rust-version = "1.97" define expectativas dos contribuidores.
Evite crates pré-1.0 em caminhos centrais sem pin: Semver 0.x permite mudanças que quebram; avaliação de risco de fork é necessária.
Empacote tipos externos em newtypes: Módulos de domínio não devem reexportar tipos de erro de fornecedores cegamente.
Agende higiene trimestral de dependências: cargo update, cargo outdated, e um PR focado corrigindo avisos.
Interligue skills e seções profundas: Páginas de crates essenciais são índices; detalhes autoritativos vivem em seções de tópicos.
A contagem importa menos que a profundidade e a manutenção. Dez crates focados superam um mega-crate não mantido.
Quando o upstream é abandonado e o crate é de segurança crítica. Documente a política de fork em ADR.
Apenas temporariamente com um ticket para publicar ou retornar a uma versão do crates.io.
Adicione quando a análise de dataframes for central. Não use Polars para simples parsing de CSV.
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+.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026