究竟什么是货物生态系统中的"箱子"以及与crates.io相关的映射是什么?

nro*_*niv 7 rust rust-crates rust-cargo

我对crates.io上托管的确切事物感到有点困惑(这是一个'crate'正确引用它们的方式)?我的理解是一个crate是Rust中的一个编译单元,但是crates和crates.io之间的映射是什么?例如,宏上的Rust编程语言附录说,因为每个箱子只能有一个程序宏:

我们的两个箱子紧密相关,因此我们在箱子的目录中创建程序宏hello_macro箱.如果我们改变了特征定义hello_macro,我们也必须改变过程宏的实现hello_macro_derive.这两个板条箱需要单独发布,使用这些板条箱的程序员需要将它们作为依赖项添加,并将它们都纳入范围.我们可以将hello_macro crate hello_macro_derive用作依赖项并重新导出过程宏代码.但是我们构建项目的方式使得程序员hello_macro即使不想要这些derive功能也可以使用.

它必须在crates.io上单独发布.这看起来非常清楚:crates.io上的箱子与本地箱子相同,并且映射是一对一的.

但是,在讨论具有可执行文件和库的项目时,它意味着它们是单独的包,但不需要单独发布.例如,sccache repo有main.rs和lib.rs. 单独的二进制包是不是实际存储在crates.io上而只存在于repo中?那么货物安装如何确定安装什么?

什么是"套餐"?

我试图运行cargo package包含二进制和库目标的示例项目.并且两者都被添加到.cargo文件中(顺便说一下,.cargo档案的确切格式是在任何地方记录的吗?).这仍然让我感到困惑.我们可以将多个板条箱作为一个包的一部分发布吗?那么我们应该将crates.io中存储的内容称为吗?我是否正确地假设每个包可以包含多个二进制包,但只包含一个库包?这是我目前的理解.

att*_*ona 6

crates.io 上托管的确切内容是包内的 crates。

是编译器的输出构件。

来自Rust 参考手册

编译模型以称为 crate 的工件为中心。每次编译都以源代码形式处理单个 crate,如果成功,则生成一个二进制形式的单个 crate:可执行文件或某种库。

是由货物,锈包管理器管理的神器。

Cargo.toml 清单文件使用以下语法定义包:

[package]
name = "hello_world"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]  
Run Code Online (Sandbox Code Playgroud)

一个包可以包含一个或多个包,例如一个库包,命名为包名称和零个或多个可执行,每个[[bin]]在清单文件的一个部分内明确定义,或者如果位于src/bin包目录内则隐式定义。

货运本书使用术语板条箱包装的别名。考虑以下语句以尝试理解:

通常*一个包的主要工件是一个库 crate,因为它用包名来标识,所以习惯上将 package 和 crate 视为同义词。

*:一个包可能只包含一个二进制文件,例如参见ripgrep