Workspaces
Cargo workspaces agrupam múltiplos pacotes com um Cargo.lock compartilhado e dependências opcionais em [workspace.dependencies].
Receita
# Cargo.toml (raiz)
[workspace]
members = ["crates/api", "crates/cli"]
resolver = "2"
[workspace.dependencies]
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1", features = ["full"] }Quando usar isso: Monorepos com crates de biblioteca, binários e internos que compartilham versões.
Exemplo de Trabalho
# crates/api/Cargo.toml
[package]
name = "api"
version = "0.1.0"
edition = "2024"
[dependencies]
serde = { workspace = true }cargo test --workspace
cargo build -p cliO que isso demonstra:
- Herança de dependências do workspace
-pseleciona o pacote- Arquivo de lock único para builds reproduzíveis
Análise Profunda
default-members para cargo build simples. Diretórios exclude. Workspace virtual (sem pacote raiz) é comum.
Armadilhas
- Versões duplicadas sem deps do workspace - Inchaço. Correção: Centralizar em
workspace.dependencies. - Publicação de subconjunto - Publique apenas crates folha, não o manifesto virtual sozinho.
path depsvs workspace -path = "../core"emmembers.- Unificação de features - O resolver 2 unifica features em todo o workspace.
- CI sem
--workspace- Perde falhas de membros. Correção:cargo test --workspace.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Módulos de crate único | Projeto pequeno | Versionamento independente necessário |
| Repositórios separados | Lançamento independente | Mudanças atômicas compartilhadas |
| Workspaces do cargo + deps git | Repositórios cruzados | Repositório único é mais simples |
FAQs
workspace virtual?
A raiz tem apenas [workspace] sem [package].default-members?
Executa o cargo com os alvos padrão.metadados compartilhados?
Tabela `workspace.package`.rust-toolchain?
Um arquivo na raiz.clippy workspace?
cargo clippy --workspace.seção patch?
Substitui deps em todo o workspace.exclude?
Ignora pastas que não são membros.renomear membro?
Atualiza o caminho dos membros.depender de membro?
api = { path = "../api" }.docs?
cargo doc --workspace.Relacionados
Versões da Pilha: 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+.