Cargo.toml în Rust

Cargo și rustup Cargo 1.0 (rust-version: 1.56; [lints]: 1.74)

Fișierul de configurare al unui proiect Rust (în format TOML): numele și versiunea, ediția, dependențele, funcționalitățile și setările de compilare.

Sintaxă
[package]          # numele, versiunea, ediția proiectului
[dependencies]     # crate-urile folosite de program
[dev-dependencies] # doar pentru teste și exemple
[features]         # funcționalități opționale
[profile.release]  # setările compilării release
[lints.rust] / [lints.clippy]
[workspace]        # mai multe pachete într-un singur depozit

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 edition fără să citești ce s-a schimbat. Folosește cargo 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.