Rust:你知道 Packages 和 Crates 的区别吗?
很多语言有 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 --bin
或 cargo 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
我是 polarisxu,北大硕士毕业,曾在 360 等知名互联网公司工作,10多年技术研发与架构经验!2012 年接触 Go 语言并创建了 Go 语言中文网!著有《Go语言编程之旅》、开源图书《Go语言标准库》等。
坚持输出技术(包括 Go、Rust 等技术)、职场心得和创业感悟!欢迎关注「polarisxu」一起成长!也欢迎加我微信好友交流:gopherstudio