Rust:你知道 Packages 和 Crates 的區(qū)別嗎?
很多語(yǔ)言有 Package 的概念,Rust 也有,但除了 Package,Rust 中更常見(jiàn)的是 Crate。那你清楚這兩個(gè)有什么不一樣嗎?今天搞清楚這個(gè)問(wèn)題。
一個(gè)常見(jiàn)的誤解是 packages 和 crates 是一樣的。對(duì)初學(xué) Rust 而言,這確實(shí)挺困擾。不過(guò),了解其中的區(qū)別很重要,否則你將無(wú)法理解 Rust 代碼是如何組織、共享和使用的。
Crate
一個(gè) crate,類似 crate 中的模塊,是一種代碼組織的方式。
一個(gè) crate,可以是一個(gè)二進(jìn)制(可執(zhí)行)或庫(kù)。
一個(gè) crate 不會(huì)獨(dú)立發(fā)布,而是作為 package 的成員發(fā)布的。
編譯器知道 crate 是什么,并使用 create 作為項(xiàng)目的命名空間。如果不在作用域內(nèi),你可以通過(guò)類似這樣的調(diào)用 std::hash::Hash 定義自己的 trait。
Package
一個(gè) package 是至少一個(gè) crate 的包裝器。
package 是可發(fā)布的。
一個(gè) package 可以包含 0 或 1 個(gè)庫(kù) create。
一個(gè) package 可以包含任意數(shù)量的二進(jìn)制 create。
將 package 加入依賴時(shí),意味著使用 package 中的一個(gè) create。
當(dāng)你使用 cargo run 或 cargo install 而指定具體的 crate 時(shí),意味著執(zhí)行 package 中的一個(gè)二進(jìn)制 crate。
當(dāng) cargo run --bin 或 cargo install --bin 后跟一個(gè) crate 名稱時(shí),意味著使用 package 中這個(gè)特定的 crate。
為什么大家會(huì)混淆?
通過(guò)上面的介紹,不知道大家清楚兩者的區(qū)別沒(méi)?
之所以很多人容易混淆,我覺(jué)得主要是因?yàn)?crates.io 導(dǎo)致的。雖然叫做 crates.io,實(shí)際上它是 packages 的倉(cāng)庫(kù)。你通過(guò) crates.io 找到了某個(gè)庫(kù),會(huì)將 package 加入 Cargo.toml 依賴中,你不需要指定具體的 crate,因?yàn)?package 只能有一個(gè)庫(kù) crate。如果倉(cāng)庫(kù)地址叫做:packages.io,可能就不會(huì)有那么多的混淆了。(我猜應(yīng)該 packages.io 被人注冊(cè)了?或者 Rust 對(duì) crate 這個(gè)名字情有獨(dú)鐘。顯然,在 Rust 中,crate 的概念比 package 更重要)
一句話:一個(gè) package 會(huì)包含有一個(gè) Cargo.toml 文件,闡述如何去構(gòu)建這些 crate。
關(guān)于兩者的區(qū)別,官方的圖書(shū)也有介紹,這是中文版:https://kaisery.github.io/trpl-zh-cn/ch07-01-packages-and-crates.html。
參考
https://jeffa.io/rust_packages_vs_crates
我是 polarisxu,北大碩士畢業(yè),曾在 360 等知名互聯(lián)網(wǎng)公司工作,10多年技術(shù)研發(fā)與架構(gòu)經(jīng)驗(yàn)!2012 年接觸 Go 語(yǔ)言并創(chuàng)建了 Go 語(yǔ)言中文網(wǎng)!著有《Go語(yǔ)言編程之旅》、開(kāi)源圖書(shū)《Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)》等。
堅(jiān)持輸出技術(shù)(包括 Go、Rust 等技術(shù))、職場(chǎng)心得和創(chuàng)業(yè)感悟!歡迎關(guān)注「polarisxu」一起成長(zhǎng)!也歡迎加我微信好友交流:gopherstudio
