crate是Rust编译器一次考虑的最小代码量。即使你运行rustc而不是cargo并传递一个源代码文件,编译器也会认为该文件是一个crate。
crate可以包含模块,这些模块可以在用crate编译的其他文件中定义,我们将在接下来的部分中看到。
crate可以有两种形式:二进制create和库create。
二进制create是可以编译为可执行文件的程序,可以运行,例如命令行程序或服务器。每个都必须有一个名为main的函数,定义可执行文件运行时会发生什么。
库crates没有main函数,也不能编译为可执行文件。相反,它们定义了旨在与多个项目共享的功能。
crate根是Rust编译器启动的源文件,它构成了crate的根模块。
包是一个或多个提供一组功能的集合。一个包包含一个Cargo.toml文件,该文件描述了如何构建这。
Cargo实际上是一个包含用于构建代码的命令行工具的二进制crate的包。
Cargo包还包含二进制crate所依赖的库crate。其他项目可以依赖Cargo库crate来使用Cargo命令行工具使用的相同逻辑。
一个包必须至少包含一个crate,无论是库还是二进制crate。
让我们来看看创建包时会发生什么。首先我们输入命令
cargo new hello-rust
在我们运行cargo new my-project,我们使用ls来查看cargo创建了什么。在项目目录中,有一个Cargo.toml文件,为我们提供了一个包。还有一个包含main.rs的src目录。
[package]
name = "hello-rust"
version = "0.1.0"
edition = "2021"
[dependencies]
在文本编辑器中打开Cargo.toml,注意没有提到src/main.rs。Cargo遵循一个约定,即src/main.rs是与包同名的二进制crate的crate根。
同样,Cargo知道,如果包目录包含src/lib.rs,则包包含一个与包同名的库crate,src/lib.rs是它的crate根。
Cargo将crate根文件传递给rustc以构建库或二进制文件。
这里,我们有一个只包含src/main.rs的包,这意味着它只包含一个名为my project的二进制crate。
如果一个包包含src/main.rs和src/lib.rs,则它有两个crate:一个二进制文件和一个库,两者都与包同名。
通过将文件放置在src/bin目录中,一个包可以有多个二进制crate:每个文件都是一个单独的二进制crate。
|_ src
|_ main.rs
|_ lib.rs
lib.rs
pub fn say(){
println!("test say");
}
main.rs
fn main() {
hello_rust::say();
}
通过上面的代码我可以看出 : lib.rs 与 main.rs 分别为库文件和二进制文件,包名相同 : hello_rest。