对于在crates.io上托管的确切内容,我有些困惑(“板条箱”是引用这些文件的正确方法)吗?我的理解是,板条箱是Rust中的一个编译单元,但是板条箱与crates.io上的映射是什么?例如,The Rust Programming Language appendix on macros说,由于每个板条箱只能有一个程序宏:
我们的两个箱子紧密相关,因此我们在
hello_macro
箱子的目录中创建了程序宏箱子。如果我们在hello_macro
中更改特征定义,则也必须在hello_macro_derive
中更改过程宏的实现。这两个板条箱将需要分别发布,并且使用这些板条箱的程序员将需要将它们都添加为依赖项,并将它们都纳入范围。相反,我们可以将hello_macro板条箱使用hello_macro_derive
作为依赖项,然后重新导出程序宏代码。但是,我们构建项目的方式使程序员即使不想使用hello_macro
功能,也可以使用derive
。
它必须在crates.io上单独发布。这似乎很清楚:在crates.io上的箱子与本地箱子相同,并且映射是一对一的。
但是,在讨论具有可执行文件和库的项目时,这意味着它们是单独的板条箱,但不必单独发布。例如,sccache存储库同时具有main.rs和lib.rs。单独的二进制条板箱是否未真正存储在crates.io上,而仅位于回购中?那么货物安装如何弄清楚要安装什么?
什么是“包裹”?
我尝试对包含二进制和库目标的示例项目运行cargo package
。并且 both 都添加到了.cargo文件中(顺便说一下,任何地方都记录了.cargo档案的确切格式?)。这仍然让我感到困惑。我们可以将多个包装箱发布为一个包装的一部分吗?我们是否应该将存储在crates.io上的内容称为 packages ?我是否可以正确假设每个程序包可以包含多个二进制板条箱,但只能包含一个库板条箱?这是我目前的理解。
答案 0 :(得分:3)
crates.io上托管的确切东西是包装内的箱子。
板条箱是编译器的输出工件。
编译模型集中在称为板条箱的工件上。每次编译都会以源代码形式处理一个板条箱,如果成功,则会以二进制形式生成一个板条箱:可执行文件或某种库。
软件包是由Rust软件包管理器Cargo管理的工件。
Cargo.toml
清单文件使用以下语法定义包:
[package]
name = "hello_world"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]
一个包可以包含一个或多个板条箱,例如,一个库板条箱(命名为包名)和零个或多个可执行板条箱,每个板条箱都在该包的[[bin]]
部分中明确定义清单文件;如果位于包的src/bin
目录中,则为隐式文件。
Cargo book使用术语crate作为包的别名。请考虑以下语句,以使您有所了解:
通常*,包的主要工件是库箱,并且由于它是用包名称标识的,因此习惯上将包和箱视为同义词。
*:软件包只能包含二进制文件,例如,参见ripgrep