Paketit ja crate:t
Moduulijärjestelmän ensimmäiset osat, joita käsittelemme, ovat paketit ja crate:t.
Crate on pienin määrä koodia, jota Rust-kääntäjä käsittelee kerrallaan. Vaikka käyttäisit rustc-komentoa cargo-komennon sijaan ja antaisit yhden lähdekooditiedoston (kuten teimme jo ”Rust-ohjelman perusteet”-kohdassa luvussa 1), kääntäjä pitää kyseistä tiedostoa crate:na. Crate:t voivat sisältää moduuleja, ja moduulit voidaan määritellä muissa tiedostoissa, jotka käännetään crate:n mukana, kuten tulemme näkemään seuraavissa osioissa.
Crate voi olla jommassakummassa muodossa: binääricrate tai kirjastocrate.
Binääricrate:t ovat ohjelmia, jotka voidaan kääntää ajettavaksi suoritettavaksi tiedostoksi, kuten komentoriviohjelma tai palvelin. Jokaisella on oltava main-funktio, joka määrittää, mitä tapahtuu suoritettavan käynnistyessä. Kaikki tähän mennessä luomamme crate:t ovat olleet binääricrate:ja.
Kirjastocrate:illa ei ole main-funktiota, eivätkä ne käänny suoritettaviksi tiedostoiksi. Sen sijaan ne määrittelevät toiminnallisuutta, joka on tarkoitettu jaettavaksi useiden projektien kesken. Esimerkiksi rand-crate, jota käytimme luvussa 2, tarjoaa toiminnallisuutta satunnaisten lukujen generointiin. Useimmiten kun rustilaiset sanovat ”crate”, he tarkoittavat kirjastocrate:a, ja he käyttävät sanaa ”crate” vaihdettavasti yleisen ohjelmointikäsitteen ”kirjasto” kanssa.
Crate-juuri on lähdekooditiedosto, josta Rust-kääntäjä aloittaa ja joka muodostaa crate:si juurimoduulin (käsittelemme moduuleja perusteellisesti kohdassa ”Laajuuden ja yksityisyyden hallinta moduuleilla”).
Paketti on yhden tai useamman crate:n kokoelma, joka tarjoaa tietyn toiminnallisuuden. Paketti sisältää Cargo.toml-tiedoston, joka kuvaa, miten nämä crate:t rakennetaan. Cargo on itse asiassa paketti, joka sisältää binääricrate:n komentorivityökalulle, jota olet käyttänyt koodisi kääntämiseen. Cargo-paketti sisältää myös kirjastocrate:n, josta binääricrate riippuu. Muut projektit voivat riippua Cargo-kirjastocrate:sta käyttääkseen samaa logiikkaa, jota Cargo-komentorivityökalu käyttää.
Paketti voi sisältää niin monta binääricrate:a kuin haluat, mutta enintään yhden kirjastocrate:n. Paketissa on oltava vähintään yksi crate, olipa se kirjasto- tai binääricrate.
Käydään läpi, mitä tapahtuu, kun luomme paketin. Ensin annamme komennon cargo new my-project:
$ cargo new my-project
Created binary (application) `my-project` package
$ ls my-project
Cargo.toml
src
$ ls my-project/src
main.rs
Kun olemme suorittaneet cargo new my-project, käytämme ls-komentoa nähdäksemme, mitä Cargo luo. my-project-hakemistossa on Cargo.toml-tiedosto, joka muodostaa paketin. Siellä on myös src-hakemisto, joka sisältää main.rs-tiedoston. Avaa Cargo.toml tekstieditorissasi ja huomaa, ettei siinä mainita src/main.rs:ää. Cargo noudattaa käytäntöä, jonka mukaan src/main.rs on binääricrate:n crate-juuri, jolla on sama nimi kuin paketilla. Vastaavasti Cargo tietää, että jos pakettihakemisto sisältää src/lib.rs:n, paketti sisältää kirjastocrate:n, jolla on sama nimi kuin paketilla, ja src/lib.rs on sen crate-juuri. Cargo välittää crate-juuritiedostot rustc-kääntäjälle kirjaston tai binäärin rakentamiseksi.
Tässä meillä on paketti, joka sisältää vain src/main.rs:n, eli se sisältää vain binääricrate:n nimeltä my-project. Jos paketti sisältää sekä src/main.rs:n että src/lib.rs:n, siinä on kaksi crate:a: binääri ja kirjasto, molemmilla sama nimi kuin paketilla. Paketissa voi olla useita binääricrate:ja sijoittamalla tiedostoja src/bin-hakemistoon: jokainen tiedosto on erillinen binääricrate.