Cargo: new, build, run și check

Subiect din roadmap-ul Rust · parte din „Introducere în Rust”

Cargo este managerul de pachete și sistemul de build pentru Rust, esențial pentru orice dezvoltator care dorește să lucreze profesional. În loc să compila manual fișierele .rs, Cargo gestionează dependențele, testează codul și generează binare optimizate, asigurând reproducibilitatea proiectului. Folosirea lui corectă este non-negociabilă în mediul de producție, deoarece standardizează fluxul de lucru și integrează nativ tooling-ul ecosistemului Rust.

Concepte cheie

  • cargo new: Creează structura de directoare și fișierul Cargo.toml necesar pentru un nou proiect, inițializând automat un repository Git opțional.
  • cargo build: Compilează codul sursă, rezolvă dependențele din Cargo.toml și generează fișierele binare sau librăriile în directorul target/.
  • cargo run: Execută un shortcut care compilează proiectul (dacă este necesar) și lansează imediat aplicația generată, ideal pentru iterări rapide.
  • cargo check: Verifică corectitudinea sintactică și semantică a codului fără a genera binarul final, fiind mult mai rapid decât build-ul complet.
  • Cargo.toml: Fișierul manifest care definește metadata proiectului, versiunea Rust-ului și dependențele externe ale aplicației tale.
  • Cargo.lock: Fișier generat automat care fixează versiunile exacte ale tuturor dependențelor, garantând că orice alt developer va construi același rezultat.
  • Workspace: O funcție avansată care permite gestionarea mai multor crate (pachete) într-un singur director, optimizând build-ul pentru proiecte mari.

Exemplu practic

Imagină-ți că construiești o aplicație CLI simplă care citește un fișier. Mai întâi, creezi proiectul:

cargo new my_cli_app
cd my_cli_app

În main.rs, scrii logica de bază. Când modifici codul, nu ai nevoie să tastezi rustc main.rs. În schimb, folosești:

# Verifici rapid erorile de compilare
cargo check

# Dacă e totul OK, rulezi aplicația
cargo run

Dacă adaugi o dependență externă, cum ar fi serde pentru parsarea JSON, o editezi în Cargo.toml:

[dependencies]
serde = { version = "1.0", features = ["derive"] }

Apoi, rulați cargo build pentru a descărca și compila noua bibliotecă. Acest flux asigură că dependența este inclusă corect în build-ul final.

Greșeli frecvente

  • Ignorarea cargo check: Timpul pierdut așteptând un cargo build complet pentru o simplă eroare de sintaxă. check este mult mai rapid și suficient pentru debug.
  • Commitarea Cargo.lock în librării: Pentru librării (crate-uri), Cargo.lock nu trebuie commitat, deoarece versiunile sunt determinate de utilizatorul final. Doar pentru aplicații (binare) se commită.
  • Dependențe nerezolvate: Uitatul să rulezi cargo update după modificarea manuală a versiunilor în Cargo.toml, ceea ce duce la discrepanțe între manifest și lock file.
  • Curățarea incorectă a cache-ului: Ștergerea manuală a folderului target fără a înțelege că acesta conține artefacte intermediare. Este mai sigur să folosești cargo clean.

Întrebări de interviu

Care este diferența dintre cargo build și cargo run? cargo build compilează codul și lasă binarul în target/debug/, dar nu îl execută. cargo run face ambele lucruri: compilează (dacă e necesar) și execută binarul generat instantaneu.

De ce este important Cargo.lock? Asigură reproducibilitatea. Fără el, o actualizare a unei dependențe transitive ar putea schimba comportamentul aplicației tăiate pe mașina unui coleg sau în production, chiar dacă Cargo.toml nu s-a schimbat.

Când folosești cargo check în locul lui cargo build? În timpul dezvoltării active, când vrei să verifici rapid erorile de compilare fără costul timpios al generării binarului optimizat. Este esențial pentru fluxuri de lucru rapide.

Exercițiu

Creează un nou proiect Cargo numit calculator_simple. Adaugă o dependență externă (de exemplu, rand) în Cargo.toml pentru a genera un număr aleatoriu între 1 și 100. Scrie un program care afișează acest număr și cere utilizatorului să ghicească valoarea. Folosește cargo check pentru a valida logica înainte de a rula aplicația cu cargo run. Scopul este să te obișnuiești cu ciclul de editare-verificare-rulare și gestionarea dependențelor externe.

Resurse gratuite

Alte subiecte din „Introducere în Rust”