板条箱和包装之间的确切区别是什么?

Abd*_*han 4 rust

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

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

官方文档在解释两者时用如此多的 OR 和 AND 将其复杂化。

这篇 reddit帖子对此进行了更好的解释,但并不彻底。

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

非常感谢!

sk_*_*ant 10

板条箱

\n

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

\n

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

\n
    \n
  • 二进制包可以由 Rust 编译器编译为可执行文件。例如,Cargo(Rust 包管理器)是一个二进制包,由 Rust 编译器转换为用于管理项目的可执行文件。
  • \n
  • 库箱就是您在其他语言中简称为库的东西。二进制包可以依赖库包来使用库提供的功能。
  • \n
\n

套餐

\n

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

\n

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

\n

创建包

\n
    \n
  • 要创建一个由一个二进制板条箱组成的新包,您可以运行cargo new
  • \n
  • 要创建一个包含一个库箱的新包,您可以运行cargo new --lib
  • \n
  • 要创建由库以及一个或多个二进制文件组成的包,您可以运行 或cargo newcargo new --lib然后修改包目录结构以添加其他 crate
  • \n
\n

什么时候应该使用板条箱,什么时候应该使用包?

\n

正如您现在所看到的,这个问题并没有真正意义 \xe2\x80\x93 您应该并且必须始终使用两者。如果没有至少一个 crate,包就不可能存在,并且 crate(至少如果您使用 Cargo)始终是包的一部分。

\n

因此,更好的问题是:

\n

什么时候应该将多个板条箱放入一个包裹中?

\n

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

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

请注意,如果您有一个非常大的项目,在这些情况下您可能想使用Cargo 的工作区功能

\n