库与二进制文件

TicketNewError实现Error特质是不是挺费劲的?手动实现Display,再加上一个Error实现块。

我们可以通过使用第三方库thiserror减少一些样板代码,它提供了一个过程宏来简化自定义错误类型的创建。但话说回来,thiserror是我们第一个依赖的第三方库!

在深入探讨依赖关系之前,我们先退一步谈谈Rust的打包系统。

什么是包?

Rust包由Cargo.toml文件中的[package]部分定义,也称为清单。在[package]内,你可以设置包的元数据,比如名称和版本。

去看看这一节练习目录下的Cargo.toml文件吧!

什么是crate?

在一个包内部,你可以有一个或多个crate,也称为目标。最常见的两种crate类型是二进制crate库crate

二进制文件

二进制文件是可以编译成可执行文件的程序。它必须包含一个名为main的函数——程序的入口点。当程序被执行时,main函数会被调用。

另一方面,库本身不可执行。你不能直接运行一个库,但可以从依赖它的其他包导入其代码。库将代码(如函数、类型等)组合在一起,作为依赖项供其他包使用。

迄今为止,你解决的所有练习都被构建为带有测试套件的库。

约定

关于Rust包,有一些约定需要记住:

  • 包的源代码通常位于src目录下。
  • 如果存在src/lib.rs文件,cargo将推断包包含一个库crate。
  • 如果存在src/main.rs文件,cargo将推断包包含一个二进制crate。

你可以通过在Cargo.toml文件中明确声明目标来覆盖这些默认值——更多细节见cargo文档

请记住,虽然一个包可以包含多个crate,但它只能包含一个库crate。

构建新包的脚手架

你可以使用cargo命令来生成一个新的包:

cargo new my-binary

这将在当前目录下创建一个名为my-binary的新文件夹,包含一个同名的Rust包和一个单一的二进制crate。

如果你想创建一个库crate,可以使用--lib标志:

cargo new my-library --lib

参考资料

  • 本节练习位于 exercises/05_ticket_v2/10_packages