pack 和 create

package和crate

crate是Rust编译器一次考虑的最小代码量。即使你运行rustc而不是cargo并传递一个源代码文件,编译器也会认为该文件是一个crate。

crate可以包含模块,这些模块可以在用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。