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.
-
Use serde + um crate de formato como padrão:
serdenas fronteiras; adicioneserde_jsonoutomlapenas onde necessário. Eviteserde_json::Valueno núcleo do domínio. -
Padronize em Tokio para IO async: Misturar runtimes multiplica bugs. Faça a ponte do
loglegado comtracing-log. -
Separe erros por função do crate:
thiserrorem bibliotecas,anyhowem binários. Nunca vazeanyhow::Errorde crates publicados. -
Reutilize clientes HTTP e de DB: Um
reqwest::Cliente umsqlx::PgPoolpor processo viaLazyLockou estado Axum. -
Escolha chrono ou time, não ambos: Documente a escolha no
READMEdo 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
rustlspor padrão: OpenSSL apenas quando a plataforma ou conformidade exigir. -
Execute
cargo deny checkem 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"] }superafullquando o tamanho importa. -
Mantenha as versões de dependência do workspace unificadas:
[workspace.dependencies]noCargo.tomlraiz evita divisões de versão. -
Commite
Cargo.lockpara 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.xpermite 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.
FAQs
Quantas dependências são demais?
A contagem importa menos que a profundidade e a manutenção. Dez crates focados superam um mega-crate não mantido.
Quando fazer vendor ou fork?
Quando o upstream é abandonado e o crate é de segurança crítica. Documente a política de fork em ADR.
Devemos permitir dependências Git?
Apenas temporariamente com um ticket para publicar ou retornar a uma versão do crates.io.
Polars em todo projeto?
Adicione quando a análise de dataframes for central. Não use Polars para simples parsing de CSV.
Relacionados
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+.