Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Cargo e gestione delle dipendenze

Cargo: il tool di build e gestione pacchetti di Rust, essenziale per gestire dipendenze e creare nuovi progetti
Cargo: il tool di build e gestione pacchetti di Rust, essenziale per gestire dipendenze e creare nuovi progetti
Link copiato negli appunti

Lo strumento cargo è estremamente ricco ed impareremo a sfruttarlo al meglio con il tempo. Qualcosa che dobbiamo fare subito è però imparare ad integrare dipendenze i un progetto. La sorgente delle dipendenze può essere delle più varie, possiamo infatti integrare repository, altri progetti Rust o, come spessissimo capita, richiedere l'installazione di crate dal portale crates.io. Con il termine crate si intendono pacchetti pronti ad essere innestati nei nostri progetti per poterne richiamare le funzionalità. Potremmo dire che si tratta della modalità più fruibile possibile per sfruttare librerie sviluppate e condivise da altri.

Il portale crates.io ospita un numero sempre crescente di progetti, da quelli molto grandi a quelli personali. Permette di scrivere documentazione, offrire link ai repository e soprattutto di installare questi pacchetti nei nostri progetti con semplici direttive inserite in Cargo.toml. Come possiamo immaginare, crates.io potrà essere anche un ottimo hub per la condivisione delle nostre creazioni!

Integriamo una dipendenza con cargo

Come primo esempio supponiamo di voler realizzare un progetto che richieda l'inclusione di uno dei package più conosciuti, rand, dedicato alla generazione di numeri casuali.

Per averlo a disposizione del nostro codice, dovremo inserirlo nella sezione dependencies di Cargo.toml. Lo potremo fare in due modi: utilizzando un apposito comando per la sua immissione o procedendo alla modifica manuale del file.

La prima via richiederà la digitazione, da riga di comando, della seguente istruzione:

$ cargo add rand

(comando add seguito dal package che desideriamo includere) e ci porterà ad ottenere, in automatico, questa direttiva nella sezione dependencies del file Cargo.toml:

[package]
name = "mioprogetto"
version = "0.1.0"
authors = ["tom"]
[dependencies]
rand = "0.8.5"

Come vediamo quindi, la sezione delle dipendenze - inizialmente vuota - ora contempla una riga che nomina la libreria, rand, e la versione che è stata scelta e che, tipicamente, sarà la più recente o la più compatibile con il contesto delle dipendenze.

In alternativa, potremo procedere con l'aggiunta manuale della stessa riga. Si potrà utilizzare l'editor di testo che preferiamo per procedere alla modifica e poi salvare il tutto.

E' tempo di sfruttare la funzionalità acquisita con la dipendenza, modificando il file main.rs per richiedere la generazione di un numero casuale compreso tra 0 e 1:

extern crate rand;
use rand::prelude::*;
fn main() {
    let mut generatore = rand::thread_rng();
    let numero_a_caso: f64 = generatore.gen();
    println!("Abbiamo generato: {}", numero_a_caso);
}

Il nostro scopo in questo caso non sarà tanto ottenere grossi risultati ma semplicemente verificare che rand sia disponibile, integrata e richiamabile.

Completamento del build

Dopo aver fatto il build vedremo cargo recuperare tutta la catena delle dipendenze con scaricamenti e compilazioni fino ad arrivare al nostro codice:

$ cargo build
  Downloaded rand_chacha v0.3.1
  Downloaded proc-macro2 v1.0.86
  Downloaded cfg-if v1.0.0
  Downloaded ppv-lite86 v0.2.20
  Downloaded rand_core v0.6.4
  Downloaded byteorder v1.5.0
  Downloaded zerocopy-derive v0.7.35
  Downloaded rand v0.8.5
  Downloaded zerocopy v0.7.35
  Downloaded syn v2.0.72
  Downloaded libc v0.2.155
  Downloaded unicode-ident v1.0.12
  Downloaded quote v1.0.36
  Downloaded getrandom v0.2.15
  Downloaded 14 crates (1.5 MB) in 0.27s
   Compiling proc-macro2 v1.0.86
   Compiling unicode-ident v1.0.12
   Compiling quote v1.0.36
   Compiling libc v0.2.155
   Compiling syn v2.0.72
   Compiling zerocopy-derive v0.7.35
   Compiling cfg-if v1.0.0
   Compiling byteorder v1.5.0
   Compiling zerocopy v0.7.35
   Compiling getrandom v0.2.15
   Compiling rand_core v0.6.4
   Compiling ppv-lite86 v0.2.20
   Compiling rand_chacha v0.3.1
   Compiling rand v0.8.5
   Compiling mioprogetto v0.1.0

Questo è di certo un aspetto estremamente utile se pensiamo che ci basterà portare un semplice file di testo, Cargo.toml, su un ambiente di esecuzione per poter avere tutto il necessario per l'allestimento di un completo ecosistema per il running. Ovviamente, sarà indispensabile che l'ambiente sia correttamente connesso alla rete Internet!

Esecuzione del programma

Al completamento del build, potremo arrivare ad eseguire il nostro programma quante volte vorremo in quanto si tratterà ormai di un eseguibile completo di tutto:

$ cargo run
Abbiamo generato: 0.4447730736116511
$ cargo run
Abbiamo generato:  0.04015233032705834
$ cargo run
Abbiamo generato:  0.8301752008793382
$ cargo run
Abbiamo generato:  0.03438392762863318

Da ora saremo pronti a sviluppare i nostri progetti utilizzando tutto il Rust che impareremo. Ma soprattutto integrando tutte le più potenti librerie che la community mette a disposizione con impegno e costanza. Scopriremo così quanto il loro lavoro sia stato fondamentale per aprirci le porte di un mondo di sottosistemi.

Ti consigliamo anche