【问题标题】:What is the exact difference between a Crate and a Package?Crate 和 Package 之间的确切区别是什么?
【发布时间】:2021-07-05 05:10:13
【问题描述】:

我来自 Java 背景,最近开始使用Rust

除了解释Crates and Packages 的那一章之外,Rust 官方文档非常不言自明。

doc官方doc在解释两者的同时,用这么多的OR和AND把它复杂化了。

这个 reddit post 解释得更好一些,但并不彻底。

Rust 中的 Crate 和 Package 之间的确切区别是什么?我们在哪里/何时使用它们?

非常感谢!

【问题讨论】:

  • 您不必BOLD链接、图片和其他短语。 粗体 仅用于文本,并且仅在需要强调时使用。当您为 Rust 添加标签时,您也不需要在标题中重复标签信息(in Rust)。您也不需要对Rust 进行代码格式化或在单词中添加图像 - 任何可以回答您问题的人都不需要图像或链接,而且不需要格式化的代码。
  • "Crate" 是编译器的编译单元。 “包”不是编译器知道的概念:它纯粹是 Cargo 的产物(Rust 的默认构建工具:如果您愿意,可以使用其他构建工具)。一个“包”(由Cargo.toml 文件定义)将相关的板条箱链接在一起:零个或多个“二进制”板条箱,最多一个“库”板条箱(在同一包中定义),以及零个或多个“依赖”板条箱(在外部包中定义)。

标签: rust


【解决方案1】:

板条箱

从 Rust 编译器的角度来看,“crate”是编译单元的名称。 crate 由一个或多个文件中的模块层次结构组成。这与大多数“传统”编译语言(如 Java、C 或 C++)形成对比,后者的编译单元是单个文件。

从用户的角度来看,这个定义并没有真正的帮助。实际上,在大多数情况下,您需要区分两种类型的 crate:

  • binary crates 可以被 Rust 编译器编译为可执行文件。例如,Rust 包管理器 Cargo 是一个二进制 crate,由 Rust 编译器翻译成您用来管理项目的可执行文件。
  • library crates 是您在其他语言中简单地称为库的东西。二进制 crate 可以依赖库 crate 来使用库提供的功能。

packages 的概念并非起源于 Rust 编译器,而是起源于 Rust 包管理器 Cargo。至少对于简单的项目,包也是您将检查到版本控制中的内容。

一个包由一个或多个 crate 组成,但不超过一个 library crate。

创建包

  • 要创建一个包含一个二进制包的新包,您可以运行cargo new
  • 要创建一个包含一个库 crate 的新包,您可以运行 cargo new --lib
  • 要创建一个包含一个库以及一个或多个二进制文件的包,您可以运行cargo newcargo new --lib,然后修改package directory structure 以添加另一个板条箱

什么时候应该使用 crates,什么时候应该使用包?

正如您现在所看到的,这个问题没有任何意义——您应该而且必须始终同时使用这两个问题。如果没有至少一个 crate,一个包就无法存在,并且一个 crate(至少如果您使用 Cargo 的话)始终是包的一部分。

因此,一个更好的问题是:

什么时候应该将多个 crate 放入一个包中?

一个包装中包含多个板条箱的原因有很多。例如:

  • 如果您有一个二进制 crate,将“业务逻辑”放在同一个包中的库中是惯用的。这有多个优点:
  • 如果您有一个生成某些文件的库包(数据库引擎或类似的东西),您可能需要一个辅助二进制文件来检查这些文件

请注意,如果您有一个非常大的项目,在这些情况下您可能希望使用 the workspace feature of Cargo

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 2013-03-25
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多