Rust 项目构建的构建的过程引入了 packag
、crate
、module
的概念,这些都属于 Rust 构建项目的基础概念,本文实体尽量将这些概念简化和便于理解。
package
还记得 cargo new hello_world_project
这个命令吗?这里 hello_world_project
其实就是一个pacakge。来让我们看下Package的定义:
Package(包)是一个用于分发、构建和管理Rust代码的基本单元。一个包包含一个或多个crate,并且每个包必须包含一个名为Cargo.toml的文件,该文件定义了包的元数据和依赖信息。
对于Javaer来说,Rust里面的 package
有点类似 maven的项目概念
crate
还拿 hello_world_project
举例吧,这里面的 src/main
其实就是 一个 crate
准确的说是一个二进制crate
(binary crate),那么crate的概念到底是什么呢?
crate
一个crate是代码的最小编译单元。一个crate可以由一个或多个文件组成,通常由一个根模块(root module)作为入口点。
还补充下 二进制Crate
和 库Crate
的概念区别:本质区别是,可独立运行的crate就可以成为 二进制Crate
,反之就是 库Crate
。
现在再理解官网的几条规则就比较好理解了:
- 包中至多 只能 包含一个库 crate(library crate);
- 包中可以包含任意多个二进制 crate(binary crate);
- 包中至少包含一个 crate,无论是库的还是二进制的。
crate的根:
src/main.rs:表示该crate是一个bin类型的crate
src/lib.rs:表示该crate是一个lib类型的crate
src/main.rs和src/lib.rs都是crate的根,也就是crate引用、rustc编译的入口。
Rust里面的所谓的 crate
个人感觉就是所谓的 *.rs
文件,但是官方文档没说,问了Chatgpt表示认可,初学先这么理解,后面再补充吧
mod
代码多了可以对代码以mod(文件/文件夹)为单位进行拆分,而不必把所有代码都写在src/lib.rs或者src/main.rs里。这个感念很好理解了,mod
关键字定义部分就是可以成为mod。如下关键部分需要注意:
- mod之间默认的私有,需要
pub
才能可见;Rust默认安全性要求,模块引用过程,如果不加pub,你就访问不了 - 子mod可见父mod,父mod不可见子mod;这个好理解,大厅经理是了解大厅的情况的,反之就不行,这里是变成范式不要纠结。
日期 | 更新说明 |
---|---|
2024年5月26日 | 初版 |