Rust 包和 Crate

2023-03-22 15:09 更新
ch07-01-packages-and-crates.md
commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c

模塊系統(tǒng)的第一部分,我們將介紹包和 crate。

crate 是 Rust 在編譯時(shí)最小的代碼單位。如果你用 rustc 而不是 cargo 來編譯一個(gè)文件(第一章我們這么做過),編譯器還是會將那個(gè)文件認(rèn)作一個(gè) crate。 crate 可以包含模塊,模塊可以定義在其他文件,然后和 crate 一起編譯,我們會在接下來的章節(jié)中遇到。

crate 有兩種形式:二進(jìn)制項(xiàng)和庫。二進(jìn)制項(xiàng) 可以被編譯為可執(zhí)行程序,比如一個(gè)命令行程序或者一個(gè)服務(wù)器。它們必須有一個(gè) main 函數(shù)來定義當(dāng)程序被執(zhí)行的時(shí)候所需要做的事情。目前我們所創(chuàng)建的 crate 都是二進(jìn)制項(xiàng)。

 并沒有 main 函數(shù),它們也不會編譯為可執(zhí)行程序,它們提供一些諸如函數(shù)之類的東西,使其他項(xiàng)目也能使用這些東西。比如 第二章 的 rand crate 就提供了生成隨機(jī)數(shù)的東西。大多數(shù)時(shí)間 Rustaceans 說的 crate 指的都是庫,這與其他編程語言中 library 概念一致。

crate root 是一個(gè)源文件,Rust 編譯器以它為起始點(diǎn),并構(gòu)成你的 crate 的根模塊(我們將在 “定義模塊來控制作用域與私有性” 一節(jié)深入解讀)。

package) 是提供一系列功能的一個(gè)或者多個(gè) crate。一個(gè)包會包含一個(gè) Cargo.toml 文件,闡述如何去構(gòu)建這些 crate。Cargo 就是一個(gè)包含構(gòu)建你代碼的二進(jìn)制項(xiàng)的包。Cargo 也包含這些二進(jìn)制項(xiàng)所依賴的庫。其他項(xiàng)目也能用 Cargo 庫來實(shí)現(xiàn)與 Cargo 命令行程序一樣的邏輯。

包中可以包含至多一個(gè)庫 crate(library crate)。包中可以包含任意多個(gè)二進(jìn)制 crate(binary crate),但是必須至少包含一個(gè) crate(無論是庫的還是二進(jìn)制的)。

讓我們來看看創(chuàng)建包的時(shí)候會發(fā)生什么。首先,我們輸入命令 cargo new

$ cargo new my-project
     Created binary (application) `my-project` package
$ ls my-project
Cargo.toml
src
$ ls my-project/src
main.rs

運(yùn)行了這條命令后,我們先用 ls (譯者注:此命令為Linux平臺的指令,Windows下可用dir)來看看 Cargo 給我們創(chuàng)建了什么,Cargo 會給我們的包創(chuàng)建一個(gè) Cargo.toml 文件。查看 Cargo.toml 的內(nèi)容,會發(fā)現(xiàn)并沒有提到 src/main.rs,因?yàn)?Cargo 遵循的一個(gè)約定:src/main.rs 就是一個(gè)與包同名的二進(jìn)制 crate 的 crate 根。同樣的,Cargo 知道如果包目錄中包含 src/lib.rs,則包帶有與其同名的庫 crate,且 src/lib.rs 是 crate 根。crate 根文件將由 Cargo 傳遞給 rustc 來實(shí)際構(gòu)建庫或者二進(jìn)制項(xiàng)目。

在此,我們有了一個(gè)只包含 src/main.rs 的包,意味著它只含有一個(gè)名為 my-project 的二進(jìn)制 crate。如果一個(gè)包同時(shí)含有 src/main.rs 和 src/lib.rs,則它有兩個(gè) crate:一個(gè)二進(jìn)制的和一個(gè)庫的,且名字都與包相同。通過將文件放在 src/bin 目錄下,一個(gè)包可以擁有多個(gè)二進(jìn)制 crate:每個(gè) src/bin 下的文件都會被編譯成一個(gè)獨(dú)立的二進(jìn)制 crate。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號