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

问题描述 投票:0回答:3

根据其手册,Cargo 包可以有多个可执行目标,但只允许有一个库目标。

一个包可以包含零个或一个库 crate,以及任意数量的二进制 crate。包中必须至少有一个 crate(库或二进制文件)。

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

rust rust-cargo
3个回答
28
投票

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

当我们使用板条箱作为依赖项时,我们仅在

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

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

Cargo 工作区 是 Cargo 提供的用于同时处理多个包的工具。


2
投票

我希望一个货物包只能有一个库目标,因为根据定义,

library crate
是一组项目(函数、类型、特征、宏、值等),而
binary crate
只有一个外部可见事物,一个主要的切入点。因此,虽然库包的名称只是层次结构中的根模块,但二进制包的名称是唯一的。


0
投票

当 Rust 文档说一个板条箱只能有一个库和一个二进制文件时,这是指每个板条箱定义产生的输出。

例如,如果您生成一些代码,则可以运行单个可执行文件,和/或供其他代码链接到的单个库。

您可以将库产品(输出)拆分为模块,以便您可以单独开发每个模块,并最终生成一个最终的捆绑库。

模块有点像内部库,它们将捆绑在一起以最终生成一个大的外部库,或者实际上生成一个完整的二进制可执行文件。

将 Crate 视为其他人可以使用的成品,而模块则是组件。标准库是一个箱子,由许多不同的模块组成。您还可以拥有子模块,并且可以拥有任意数量的子模块。但它们被 Cargo 编译成一个最终(输出)库。

您还可以在包中包含任意数量的 crate,但您的 crate 通常只会生成一个可执行文件(大多数情况)或一个库。

© www.soinside.com 2019 - 2024. All rights reserved.