42、Packages(包)
Libraries and binaries(库和二进制文件)
上一节的练习,为TicketNewError
实现Error
trait写了很多代码,手动实现Display
,还有Error
实现块。
我们可以使用thiserror
删除一些boilerplate
(样板代码,在编程中指的是重复性、模板化的代码,通常用于初始化项目结构、设置配置或实现常见模式)。这是一个Rust crate
,它提供了一个procedural macro
(过程宏)来简化自定义错误类型的创建。
但是我们走在了我们自己的前面:thiserror
是一个第三方crate,这将是我们的第一个依赖项。
什么是Package?
Rust package由Cargo.toml
文件(也称其为manifest,清单)中的[package]
部分定义。在[package]
中,我们可以设置包的metadata
(元数据),例如其名称和版本。
什么是crate?
在package里面,我们可以有一个或多个crate
,也被称为targets
(目标)。最常见的两种crate
类型是binary crates
和library crates
。
Binaries
binary是可以编译为可执行文件的程序。
它必须包含一个名为main
的函数——程序的入口点。main
在程序执行时被调用。
Libraries
另一方面,Libraries本身是不可知性的。我们无法运行一个library,但是我们可以从依赖于它的另一个包导入其代码。
library将代码(即函数、类型等)组合在一起,可以被其他包作为依赖项利用这些代码。
到目前为止,我们的所有练习都是以libraries的形式构建的,并附有测试套件。
Conventions(惯例)
有一些关于Rust packages的惯例,需要记住:
- package的源代码通常位于
src
目录下。 - 如果有一个
src/lib.rs
文件,cargo
将推断这个package包含一个library crate。 - 如果有一个
src/main.rs
文件,cargo
将推断这个package包含一个binary crate。
我们可以通过在cargo.toml
文件中显式声明我们的目标来覆盖这些默认设置——详情可以从cargo文档查看。
重点:一个package可以包含多个crates
,但只能包含一个library crate
。
练习
这个练习包含两个文件:
lib.rs
main.rs
让我们修复main.rs里面的导入
main.rs:
// This is a `main.rs` file, therefore `cargo` interprets this as the root of a binary target.
// TODO: fix this broken import. Check library target in the `src` directory.
// The library target should expose a public function named `hello_world` that takes no arguments
// and returns nothing.
use task_packages::hello_world;
// This is the entrypoint of the binary.
fn main() {
hello_world();
}
lib.rs:
/* TODO */
也挺简单的,我们只需要在lib.rs
文件里创建一个pub的hello_world
函数即可:
/* TODO */
pub fn hello_world(){}
这段代码运行无误,溜了溜了…
这一节的学习就到这里了。