W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
ch07-01-packages-and-crates.md
commit c77d7a1279dbc7a9d76e80c5ac9d742dd529538c
模塊系統(tǒng)的第一部分,我們將介紹包和 crate。
crate 是 Rust 在編譯時最小的代碼單位。如果你用 rustc
而不是 cargo
來編譯一個文件(第一章我們這么做過),編譯器還是會將那個文件認作一個 crate。 crate 可以包含模塊,模塊可以定義在其他文件,然后和 crate 一起編譯,我們會在接下來的章節(jié)中遇到。
crate 有兩種形式:二進制項和庫。二進制項 可以被編譯為可執(zhí)行程序,比如一個命令行程序或者一個服務(wù)器。它們必須有一個 main
函數(shù)來定義當程序被執(zhí)行的時候所需要做的事情。目前我們所創(chuàng)建的 crate 都是二進制項。
庫 并沒有 main
函數(shù),它們也不會編譯為可執(zhí)行程序,它們提供一些諸如函數(shù)之類的東西,使其他項目也能使用這些東西。比如 第二章 的 rand
crate 就提供了生成隨機數(shù)的東西。大多數(shù)時間 Rustaceans
說的 crate 指的都是庫,這與其他編程語言中 library 概念一致。
crate root 是一個源文件,Rust 編譯器以它為起始點,并構(gòu)成你的 crate 的根模塊(我們將在 “定義模塊來控制作用域與私有性” 一節(jié)深入解讀)。
包(package) 是提供一系列功能的一個或者多個 crate。一個包會包含一個 Cargo.toml 文件,闡述如何去構(gòu)建這些 crate。Cargo 就是一個包含構(gòu)建你代碼的二進制項的包。Cargo 也包含這些二進制項所依賴的庫。其他項目也能用 Cargo 庫來實現(xiàn)與 Cargo 命令行程序一樣的邏輯。
包中可以包含至多一個庫 crate(library crate)。包中可以包含任意多個二進制 crate(binary crate),但是必須至少包含一個 crate(無論是庫的還是二進制的)。
讓我們來看看創(chuàng)建包的時候會發(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
運行了這條命令后,我們先用 ls
(譯者注:此命令為Linux平臺的指令,Windows下可用dir)來看看 Cargo 給我們創(chuàng)建了什么,Cargo 會給我們的包創(chuàng)建一個 Cargo.toml 文件。查看 Cargo.toml 的內(nèi)容,會發(fā)現(xiàn)并沒有提到 src/main.rs,因為 Cargo 遵循的一個約定:src/main.rs 就是一個與包同名的二進制 crate 的 crate 根。同樣的,Cargo 知道如果包目錄中包含 src/lib.rs,則包帶有與其同名的庫 crate,且 src/lib.rs 是 crate 根。crate 根文件將由 Cargo 傳遞給 rustc
來實際構(gòu)建庫或者二進制項目。
在此,我們有了一個只包含 src/main.rs 的包,意味著它只含有一個名為 my-project
的二進制 crate。如果一個包同時含有 src/main.rs 和 src/lib.rs,則它有兩個 crate:一個二進制的和一個庫的,且名字都與包相同。通過將文件放在 src/bin 目錄下,一個包可以擁有多個二進制 crate:每個 src/bin 下的文件都會被編譯成一個獨立的二進制 crate。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: