gpt4 book ai didi

rust - Cargo 生态系统中的 'crate' 到底是什么,与 crates.io 上的内容的映射是什么?

转载 作者:行者123 更新时间:2023-11-29 07:46:55 25 4
gpt4 key购买 nike

我对 crates.io 上托管的确切内容有点困惑(“ crate ”是指代这些内容的正确方式吗)?我的理解是 crate 是 Rust 中的一个编译单元,但是 crates 和 crates.io 上的内容之间的映射是什么?例如,The Rust Programming Language appendix on macros说因为每个 crate 只能有一个程序宏:

Our two crates are tightly related, so we create the procedural macro crate within the directory of our hello_macro crate. If we change the trait definition in hello_macro, we’ll have to change the implementation of the procedural macro in hello_macro_derive as well. The two crates will need to be published separately, and programmers using these crates will need to add both as dependencies and bring them both into scope. We could instead have the hello_macro crate use hello_macro_derive as a dependency and reexport the procedural macro code. But the way we’ve structured the project makes it possible for programmers to use hello_macro even if they don’t want the derive functionality.

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

但是,在讨论包含可执行文件和库的项目时,这意味着它们是单独的包,但不需要单独发布。例如,sccache 存储库同时包含 main.rs 和 lib.rs。单独的二进制 crate 是否实际上没有存储在 crates.io 上并且仅驻留在 repo 中?那么 cargo install 如何确定要安装什么?

什么是“包”?

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

最佳答案

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

crate 是编译器的输出工件。

来自 Rust Reference Manual :

The compilation model centers on artifacts called crates. Each compilation processes a single crate in source form, and if successful, produces a single crate in binary form: either an executable or some sort of library.

是由 Rust 包管理器 Cargo 管理的工件。

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

[package]
name = "hello_world"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]

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

Cargo book使用术语 crate 作为 package 的别名。考虑以下语句以尝试了解一些意义:

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

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

关于rust - Cargo 生态系统中的 'crate' 到底是什么,与 crates.io 上的内容的映射是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52024304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com