Rust:你知道 Packages 和 Crates 的區別嗎?

語言: CN / TW / HK

關注「 Rust程式設計指北 」,一起學習 Rust,給未來投資

大家好,我是螃蟹哥。

很多語言有 Package 的概念,Rust 也有,但除了 Package,Rust 中更常見的是 Crate。那你清楚這兩個有什麼不一樣嗎?今天搞清楚這個問題。

一個常見的誤解是 packages 和 crates 是一樣的。對初學 Rust 而言,這確實挺困擾。不過,瞭解其中的區別很重要,否則你將無法理解 Rust 程式碼是如何組織、共享和使用的。

Crate

一個 crate,類似 crate 中的模組,是一種程式碼組織的方式。

一個 crate,可以是一個二進位制(可執行)或庫。

一個 crate 不會獨立釋出,而是作為 package 的成員釋出的。

編譯器知道 crate 是什麼,並使用 create 作為專案的名稱空間。如果不在作用域內,你可以通過類似這樣的呼叫 std::hash::Hash 定義自己的 trait。

Package

一個 package 是至少一個 crate 的包裝器。

package 是可釋出的。

一個 package 可以包含 0 或 1 個庫 create。

一個 package 可以包含任意數量的二進位制 create。

將 package 加入依賴時,意味著使用 package 中的一個 create。

當你使用 cargo run 或 cargo install 而指定具體的 crate 時,意味著執行 package 中的一個二進位制 crate。

cargo run --bincargo install --bin 後跟一個 crate 名稱時,意味著使用 package 中這個特定的 crate。

為什麼大家會混淆?

通過上面的介紹,不知道大家清楚兩者的區別沒?

之所以很多人容易混淆,我覺得主要是因為 crates.io 導致的。雖然叫做 crates.io,實際上它是 packages 的倉庫。你通過 crates.io 找到了某個庫,會將 package 加入 Cargo.toml 依賴中,你不需要指定具體的 crate,因為 package 只能有一個庫 crate。如果倉庫地址叫做:packages.io,可能就不會有那麼多的混淆了。(我猜應該 packages.io 被人註冊了?或者 Rust 對 crate 這個名字情有獨鍾。顯然,在 Rust 中,crate 的概念比 package 更重要)

一句話:一個 package 會包含有一個 Cargo.toml 檔案,闡述如何去構建這些 crate。

關於兩者的區別,官方的圖書也有介紹,這是中文版:https://kaisery.github.io/trpl-zh-cn/ch07-01-packages-and-crates.html。

參考

  • https://jeffa.io/rust_packages_vs_crates

推薦閱讀

覺得不錯,點個贊吧

掃碼關注「 Rust程式設計指北