42、Packages(包)

Libraries and binaries(库和二进制文件)

 

上一节的练习,为TicketNewError实现Errortrait写了很多代码,手动实现Display,还有Error实现块。

 

我们可以使用thiserror删除一些boilerplate(样板代码,在编程中指的是重复性、模板化的代码,通常用于初始化项目结构、设置配置或实现常见模式)。这是一个Rust crate,它提供了一个procedural macro(过程宏)来简化自定义错误类型的创建。

 

但是我们走在了我们自己的前面:thiserror是一个第三方crate,这将是我们的第一个依赖项。

 

什么是Package?

 

Rust package由Cargo.toml文件(也称其为manifest,清单)中的[package]部分定义。在[package]中,我们可以设置包的metadata(元数据),例如其名称和版本。

image-20250917093703060

 

什么是crate?

 

在package里面,我们可以有一个或多个crate,也被称为targets(目标)。最常见的两种crate类型是binary crateslibrary 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(){}

 

这段代码运行无误,溜了溜了…

 

这一节的学习就到这里了。

 

阅读剩余
THE END