Ce face Cargo.toml
Fiecare proiect Cargo are în rădăcină un Cargo.toml, scris în formatul TOML (secțiuni între paranteze drepte și perechi cheie = valoare). Secțiunea [package] conține numele, versiunea (versionare semantică: MAJOR.MINOR.PATCH), ediția limbajului (edition = "2024") și, opțional, versiunea minimă de Rust (rust-version).
[dependencies] listează crate-urile folosite: rand = "0.10" înseamnă „0.10.x, cea mai nouă”. Forma extinsă permite funcționalități, dependențe opționale, căi locale sau depozite git: serde = { version = "1", features = ["derive"] }. [dev-dependencies] sunt folosite doar de teste. Versiunile exacte alese sunt salvate în Cargo.lock.
[features] definește funcționalități opționale, activate cu --features. [profile.dev] și [profile.release] schimbă setările compilării (nivelul de optimizare, lto, panic = "abort"). [lints] setează avertismentele pentru tot proiectul, iar [workspace] grupează mai multe pachete cu un singur Cargo.lock și un singur director target/.
Exemple
Exemplul 1: Un Cargo.toml complet pentru o aplicație
Proiectul cere cel puțin Rust 1.85, are trei dependențe (una opțională, activată de funcționalitatea export) și un profil release optimizat pentru mărime.
[package]
name = "catalog-scolar"
version = "1.2.0"
edition = "2024"
rust-version = "1.85"
authors = ["Ana Popescu <ana@exemplu.ro>"]
description = "Catalog electronic pentru note și absențe"
license = "MIT"
[dependencies]
serde = { version = "1.0", features = ["derive"] }
chrono = "0.4"
csv = { version = "1.3", optional = true }
[dev-dependencies]
pretty_assertions = "1.4"
[features]
default = []
export = ["dep:csv"]
[profile.release]
opt-level = "z"
lto = true
strip = true
[lints.rust]
unsafe_code = "forbid"
[lints.clippy]
needless_range_loop = "allow"
Efect
cargo build -> fără csv (funcționalitatea export nu este activă)
cargo build --features export -> include și csv
cargo build --release -> executabil optimizat pentru mărime, fără simboluri
orice bloc unsafe din proiect -> eroare de compilare
Exemplul 2: Un workspace cu două pachete
Cargo.toml din rădăcină nu are [package], doar lista membrilor. Aplicația folosește biblioteca prin cale locală. Toate pachetele împart Cargo.lock și target/.
# Cargo.toml (rădăcina)
[workspace]
members = ["aplicatie", "calcule"]
resolver = "3"
# aplicatie/Cargo.toml
[package]
name = "aplicatie"
version = "0.1.0"
edition = "2024"
[dependencies]
calcule = { path = "../calcule" }
$ cargo build
Rezultat în terminal
Compiling calcule v0.1.0 (/home/ana/proiecte/scoala/calcule)
Compiling aplicatie v0.1.0 (/home/ana/proiecte/scoala/aplicatie)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.36s
Greșeli frecvente
- Scrii versiunea ca număr (
version = 1.0) în loc de text ("1.0.0"): eroare de parsare TOML / versiune invalidă. - Schimbi
editionfără să citești ce s-a schimbat. Foloseștecargo fix --edition, care adaptează automat codul la ediția nouă. - Pui dependențele folosite doar în teste în
[dependencies]: ajung și în programul final. Mută-le în[dev-dependencies].
Comenzi înrudite
cargo new: Creează un proiect Rust nou: directorul, Cargo.toml, src/main.rs (sau src/lib.rs) și un depozit git.cargo add: Adaugă o dependență (un crate de pe crates.io) în Cargo.toml, cu ultima versiune compatibilă. cargo remove o scoate.cargo update: Actualizează versiunile dependențelor din Cargo.lock la cele mai noi compatibile cu Cargo.toml, fără să schimbe Cargo.toml.cargo publish: Împachetează biblioteca și o publică pe crates.io, de unde oricine o poate folosi cu cargo add. O versiune publicată nu mai poate fi ștearsă.atribute (#[derive], #[cfg], #[allow]): Informații pentru compilator scrise cu #[…] deasupra unui element: generează cod (derive), aleg codul compilat (cfg) sau schimbă avertismentele.