对于像我这种初学者来说,Rust 的各种包、模块的逻辑还是需要梳理一下的,想梳理好这部分,需要先弄明白四个对象类型:包、单元包、模块、路径。
包 (package)
一个用于构建、测试并分享单元包的 Cargo 功能。
从概念来看,包中必须要有单元包,在 Cargo 中可以使用如下命令建立一个包,已 modtest 为例:
cargo new modtest
最终会在环境里面建立如下内容:
#cargo new modtest
Created binary (application) `modtest` package
# tree modtest
modtest
├── Cargo.toml
└── src
└── main.rs
1 directory, 2 files
包中默认包含了一个配置文件 Cargo. Toml 和一个 src 目录,src 目录中包含了一个名为 main. Rs 的文件,这个文件就是默认的根单元包,这也意味着一个包中必须要包含至少一个单元包。
单元包(crate)
一个用于生成库或可执行文件的树形模块结构。单元包分为二进制单元包、库单元包,上面介绍的 main. rs 就是一个二进制单元包,执行编译后会生成一个可执行的二进制文件,库单元包一般放在 lib. rs 中。如果想创建一个带有库单元包的包,可以使用如下命令:
cargo new libtest --lib
–lib : 生成一个带有库单元包的包
–bin: 生成一个带有二进制单元包的包(默认)
会生成如下内容:
# cargo new libtest --lib
Created library `libtest` package
# tree ./libtest/
./libtest/
├── Cargo.toml
└── src
└── lib.rs
1 directory, 2 files
对于一个包中单元包还有如下一些限制
- 一个包中必须要包含至少一个单元包
- 单元包有两种类型:二进制单元包(编译后生成二进制程序)、库单元包(编译后生成库)
- 一个包中最多只能有一个库单元包,可以有多个二进制单元包
- 单元包中包含多个模块,Rust编译时使用的入口文件称作单元包的根节点/根模块
<