Ci vogliono circa dieci minuti. Ti servono un terminale e una connessione a internet; non è necessario conoscere bene Cargo.
Prima di iniziare
QuickRust deve essere installato. Se non lo è, segui Come installare QuickRust e poi apri un nuovo terminale.
Verifica che cargo ora sia QuickRust:
qrust doctor
Il comando stampa ciò che QuickRust usa (la sua home, la toolchain, Cargo e rustc) e termina con una riga che dice soltanto:
OK
Se invece termina con FAIL, le righe sopra dicono che cosa non va; Come installare QuickRust tratta le cause più comuni.
Crea un programma
Lavoreremo in un nuovo progetto chiamato hello. In una directory in cui tieni i tuoi progetti, esegui:
cargo new hello
cd hello
QuickRust risponde con una riga, più una nota di Cargo:
OK Created binary (application) `hello` package
NOTE see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
Nota come inizia ogni riga: OK per qualcosa che ha funzionato, NOTE per qualcosa che vale la pena sapere. Ogni riga che QuickRust stampa a proposito di un esito inizia con una parola del genere, nella stessa colonna.
Compilalo ed eseguilo
Esegui il programma:
cargo run
Per un momento una riga di stato mostra che cosa si sta compilando; poi viene sostituita da un unico riepilogo, e il programma parte:
OK Built: 1 compiled [59ms]
Hello, world!
Il tempo tra parentesi sarà diverso sulla tua macchina. Laddove il semplice Cargo stampa una riga Compiling per ogni crate, QuickRust stampa una sola riga per l’intera build.
Ora elenca i file del progetto:
ls
Cargo.lock Cargo.toml src
Non c’è alcuna directory target. QuickRust tiene l’output di build di ogni progetto nella propria cache, fuori dal progetto. Chiedigli dove:
qrust path
/home/you/.qrust/cache/builds/hello-38cd7ad91fa9d702
Il tuo percorso termina con un numero diverso. Esegui di nuovo il programma:
cargo run
OK Up to date: 1 fresh
Hello, world!
Dall’ultima build non è cambiato nulla, e QuickRust lo dice prima che il programma parta.
Provoca un warning
Apri src/main.rs e sostituiscine il contenuto con:
fn main() {
let name = "world";
println!("Hello, world!");
}
Abbiamo creato una variabile senza usarla. Esegui il programma:
cargo run
OK Built: 1 compiled [58ms]
WARN 1 warning in hello (bin): unused_variables x1; `qrust warnings` shows them
Hello, world!
La build è riuscita, quindi il riepilogo dice ancora OK, e una riga WARN conta il warning per tipo invece di stamparlo. Leggiamolo:
qrust warnings
warning: unused variable: `name`
--> src/main.rs:2:9
|
2 | let name = "world";
| ^^^^ help: if this is intentional, prefix it with an underscore: `_name`
|
= note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
È il messaggio del compilatore stesso, conservato da QuickRust quando la build è stata eseguita.
Provoca un errore
Ora modifica la riga println! in modo che usi la variabile, ma scrivine male il nome:
fn main() {
let name = "world";
println!("Hello, {}!", nme);
}
Esegui il programma:
cargo run
Questa volta l’errore viene mostrato per intero, sotto un’intestazione che indica il crate a cui appartiene, e il riepilogo dice FAIL:
--- hello (bin)
error[E0425]: cannot find value `nme` in this scope
--> src/main.rs:3:28
|
3 | println!("Hello, {}!", nme);
| ^^^
|
help: a local variable with a similar name exists
|
3 | println!("Hello, {}!", name);
| +
FAIL Build: 1 error in hello (bin), first at src/main.rs:3:28 [41ms]
Il programma non è stato eseguito. Correggi nme in name ed eseguilo di nuovo:
cargo run
OK Built: 1 compiled [59ms]
Hello, world!
Anche il warning è sparito, perché ora la variabile viene usata.
Aggiungi una dipendenza
Il nostro programma stamperà un numero con l’aiuto di un piccolo crate, itoa. Aggiungilo:
cargo add itoa
QuickRust mostra la dipendenza che ha aggiunto e le feature che offre, poi il risultato:
added itoa 1.0.18 to dependencies
features -no-panic
locked +itoa 1.0.18
OK [117ms]
Potresti vedere una versione più recente di 1.0.18. Le righe che appartengono a un esito sono rientrate sotto di esso, e la riga OK non ha nulla da aggiungere se non il tempo: le righe sopra dicono già che cosa è successo.
Sostituisci src/main.rs con un programma che usa il crate:
fn main() {
let mut buffer = itoa::Buffer::new();
println!("The answer is {}", buffer.format(answer()));
}
fn answer() -> u32 {
6 * 7
}
Eseguilo:
cargo run
QuickRust scarica il crate, riporta il download in una riga e compila entrambi i crate:
Downloaded 1 crate, 15.6 KiB [0.08s]
OK Built: 2 compiled [241ms]
The answer is 42
Pulisci e compila di nuovo
Rimuovi l’output di build:
cargo clean
OK Removed 123 files, 21.7 MiB
Poi esegui il programma ancora una volta:
cargo run
OK Built: 1 compiled, 1 restored from QuickRust's cache [119ms]
The answer is 42
È stato compilato solo il nostro crate. QuickRust aveva conservato itoa dalla prima build e l’ha ripristinato invece di compilarlo di nuovo; ogni progetto su questa macchina che usa lo stesso crate, compilato allo stesso modo, lo condivide. (Perché questo sia sicuro è l’argomento de La cache degli artefatti.)
Aggiungi un test
Aggiungi un test in fondo a src/main.rs:
#[test]
fn the_answer_is_42() {
assert_eq!(answer(), 42);
}
Esegui i test:
cargo test
QuickRust prima compila, come prima; poi i test vengono eseguiti e il loro output viene mostrato così come lo ha stampato l’harness dei test, e un’ultima riga somma i risultati:
OK Built: 1 compiled, 1 fresh [73ms]
unittests src/main.rs
running 1 test
test the_answer_is_42 ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
OK Tests: 1 passed [12ms]
Che cosa abbiamo fatto
Abbiamo creato un programma, lo abbiamo compilato ed eseguito, abbiamo letto un warning che QuickRust ha conservato per noi, abbiamo corretto un errore a partire dal suo messaggio completo, abbiamo aggiunto una dipendenza, abbiamo visto QuickRust ripristinarla dalla sua cache dopo una pulizia e abbiamo eseguito un test. Per tutto il tempo, ogni esito è stato una riga che iniziava con OK, WARN o FAIL.
Tutto ciò che abbiamo digitato era un normale comando di Cargo: QuickRust prende il posto di cargo ed esegue sotto di sé il Cargo della tua toolchain Rust.
Dove andare ora
- Scoprire dove va il tempo di una build, il tutorial successivo, guarda all’interno di una build più grande.
- Come vedere i warning, gli errori e il log completo di una build e Come trovare gli output di build senza target/ per il lavoro di tutti i giorni.
- L’output delle build di QuickRust e Come funziona QuickRust per le ragioni dietro ciò che hai visto.