Aquacolor

Aquacolor



Rust三度——crate的解释【1】

Gumdrop · 2026-03-09 · 1浏览 · 未分类



摘要

crate在各种文章中,都是作为library、package等的代替用的,即表示C++/Python等在学习过程中经常出现的第三方库的概念,但是该概念在官方教程中有进一步的意义1。crate、package、module三个概念,构成了解释rust项目文件结构的核心。

package

运行cargo --list的输出结果中有下面的描述:

new                  Create a new cargo package at <path>
package              Assemble the local package into a distributable tarball
search               Search packages in the registry. Default registry is crates.io

这说明,官方(或者说cargo自作主张)认定的package的范围,基本上相当于一整个项目。由于cargo起作用主要依靠cargo.toml,可以认为:

从开发者角度,用cargo install等指令从本地打包、从网络获取的,都是package;从项目结构角度,每个文件夹下含有./src./cargo.toml的文件夹,只要文件符合要求,就可用cargo package打包,因此都是package;总的来看,package这个词不适合用来描述项目的结构,这个词的使用不多也不重要。

实际上,一个cargo管理的rust项目,不一定能被打包成一个package。例如,在项目根目录下的./cargo.toml中,如果没有[package]域,那么就不能被打包;如果根目录下有package,此时根目录的./cargo.toml中往往会有[workspace]域的members属性,指明含有的成员package,此时可用cargo build -p等指令选择要操作的package而不必改变终端的工作目录。

crate

社区一定会把第三方库叫做crate,因为这是传统。在官方教程中,一个crate几乎和一个源代码文件等价。

由于crate和module的关系深,所以先简述crate相关的概念:

  1. binary crate:被编译成一个二进制程序(或者可执行程序.exe),特点是在目录中通常名为./main.rs,目录名在./src/bin/下,代码中有fn main入口点函数。

  2. library crate:被编译成.rlib文件。一个package只能有一个library crate,这一点后面解释。特点是通常在./src下,并且名称为lib.rs

  3. crate root:指生成当前最外层module的crate,也是后面。

一个package只能有一个.rlib文件,因此library crate只有一个。特殊情况就是一个文件不能代表一个crate时,这种情况发生在开发者将该crate的module结构先“声明”在某个.rs中,而在相应的文件目录下的.rs负责实现。这种模式可以轻易分层控制访问权限,而Rust语法中的访问控制是用pub表示公有,无修饰符则私有。

module

对module的概念是否掌握直接关系到学习者的头晕程度大小,而module直接与usemod两个关键字相关。

首先是和crate root的概念联系起来。用use在当前crate中找crate外的结构体、类、函数、变量、枚举、子模块等工具,使用绝对路径时的第一个module就是全package的crate root。

对于相对路径找工具的情况,也可以认为有一个局部的根,但是最好别。

在Rust中能自然的运用路径的概念,是因为module和目录相关。在.rs中声明mod a_module,会按顺序从:

  1. 后方大括号;

  2. 和该.rs同目录的./a_module.rs

  3. 同目录的./a_module/mod.rs

三个位置找到定义。其实前两种都可以用第三种模式写,但是现在通常是在./a_module.rs中写出核心部分,而其他工具在./a_module/tool.rs或者下层module写。

第三方库可以用use是因为在cargo.toml中写了依赖项[dependencies],而在同一个crate中,要用use一定要先mod,分别起到别名和实际引入工具到环境的作用。

对于不同package的情况,可以在cargo.toml中编辑依赖项使该package能直接use本地工具,但是不好。

重点总结

一个crate是从crate root开始,能通过mod声明和目录结构联系在一起的所有.rs文件。由于一个package只有一个library crate,因此package都应该能被叫做crate。因为binary crate的地位类似于发布用、客户端等,如果和一个library crate在同目录,通常作为建立在library crate之上的工具,其功能需要调用library crate的工具才能实现。

在开发时只使用module,而发布时用crate;对于binary crate的称呼,直接按功能称呼,如程序包、客户端等。



©

comment 评论区

添加新评论

face表情



  • ©2026 bilibili.com

textsms
内容不能为空
昵称不能为空
email
邮件地址格式错误
web
beach_access
验证码不能为空
keyboard发表评论


star_outline 咱快来抢个沙发吧!




©2026 Aquacolor

Theme Romanticism2.2 by Akashi
Powered by Typecho