库与二进制文件
为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