为什么一个 Cargo 包只能有一个库目标?

Why can a Cargo package only have one library target?

According to its manual,Cargo 包可以有多个可执行目标,但只允许有一个库目标。

A package can contain zero or one library crates and as many binary crates as you’d like. There must be at least one crate (either a library or a binary) in a package.

为什么限一个?原因和好处是什么?

Cargo 主要是一个包管理器。因此,包的主要作用是定义一个库。

当我们使用 crate 作为依赖项时,我们只在 Cargo.toml 中指定包名称。由于最多可以有一个库,Cargo 不需要您指定使用哪个库。如果允许在同一个包中定义多个库,那么我们需要指定一种方法来定义它们之间的依赖关系,这样你就有两种方法来声明依赖关系(外部包与内部包),使系统更复杂。

另一方面,添加不提供库的依赖项没有任何意义,至少对于 Cargo 而言是这样,因为 Cargo 只关心该上下文中的库目标。因此,没有理由将其他类型的目标(二进制文件、示例、测试等)限制为各一个。

我希望货物包只能有一个库目标,因为 library crate 根据定义是项目的集合(函数、类型、特征、宏、值等),而 binary crate 只有一个外部可见的东西,一个主入口点。因此,虽然库包的名称只是层次结构中的根模块,但二进制包的名称是唯一的。