Crate e Cargo in Rust
Cargo è il build system e package manager ufficiale di Rust. I crate sono le unità di compilazione e distribuzione del codice Rust.
Cos’è un Crate
Un crate può essere di due tipi:
- Binary crate: produce un eseguibile, ha una funzione
main() - Library crate: fornisce funzionalità riutilizzabili, non ha
main()
# Crea un binary crate
cargo new mio_progetto
# Crea un library crate
cargo new mia_libreria --lib
Struttura del Progetto
mio_progetto/
├── Cargo.toml # Configurazione del progetto
├── Cargo.lock # Versioni esatte delle dipendenze
├── src/
│ ├── main.rs # Entry point (binary)
│ └── lib.rs # Entry point (library)
├── tests/ # Test di integrazione
├── benches/ # Benchmark
└── examples/ # Esempi
Cargo.toml
[package]
name = "mio_progetto"
version = "0.1.0"
edition = "2024"
authors = ["Nome <email@esempio.com>"]
description = "Descrizione del progetto"
[dependencies]
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1", features = ["full"] }
rand = "0.8"
[dev-dependencies]
criterion = "0.5"
[build-dependencies]
cc = "1.0"
Aggiungere Dipendenze
# Aggiunge una dipendenza
cargo add serde
# Con features specifiche
cargo add serde --features derive
# Versione specifica
cargo add tokio@1.0 --features full
# Solo per sviluppo
cargo add --dev criterion
Comandi Principali di Cargo
cargo build # Compila il progetto (debug)
cargo build --release # Compila ottimizzato (release)
cargo run # Compila ed esegue
cargo test # Esegue i test
cargo check # Controlla errori senza compilare (veloce)
cargo doc --open # Genera e apre la documentazione
cargo fmt # Formatta il codice
cargo clippy # Linting avanzato
cargo update # Aggiorna le dipendenze
cargo publish # Pubblica su crates.io
Features
Le features permettono compilazione condizionale:
[features]
default = ["json"]
json = ["serde_json"]
xml = ["quick-xml"]
full = ["json", "xml"]
#[cfg(feature = "json")]
pub mod json_support {
pub fn parse(data: &str) { /* ... */ }
}
Workspace
Per progetti con più crate correlati:
# Cargo.toml nella root
[workspace]
members = [
"core",
"cli",
"server",
]
Crates.io
crates.io è il registro ufficiale per condividere crate. Per pubblicare:
cargo login # Login con token API
cargo publish --dry-run # Verifica prima di pubblicare
cargo publish # Pubblica il crate
Conclusione
Cargo è uno degli strumenti più apprezzati dell’ecosistema Rust. Gestisce in modo integrato compilazione, dipendenze, testing, documentazione e pubblicazione. Il sistema di crate e il registro crates.io facilitano la condivisione e il riutilizzo del codice nella comunità Rust.