我已经阅读了使用包、板条箱和模块管理不断增长的项目,但我仍然不太理解层次结构。我知道什么是 crate,并且包中应该至少有一个 crate:最多 1 个库 crate 和 0 个或更多二进制 crate。
第一:假设我想将两者lib.rs
都main.rs
放在包装中。如何从lib.rs
in访问/调用函数main.rs
?
其次:当我创建新库时,cargo new --lib library-name
它会创建具有该名称的目录和一堆文件,我想出从该库中调用函数的唯一方法src/main.rs
是:
mod some_library;
use crate::library_name::library_name::foo;
fn main() {
foo();
}
Run Code Online (Sandbox Code Playgroud)
// Filename: src/library_name.rs
pub mod library_name; // I don't really understand this
// Filename: src/library_name/library_name.rs
pub fn foo() {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我有以下层次结构:
- package_name
- src
- library_name
- src
- lib.rs
- Cargo.toml
- library_name.rs
- library_name.rs
- main.rs
- Cargo.toml
Run Code Online (Sandbox Code Playgroud)
是否必须src/library_name.rs
与图书馆同名src/library_name
?我真的很困惑。
这是一个三级或四级的层次结构。
工作区(可选):顶部是工作区。工作区由一个或多个包组成。该Cargo.toml
文件很特殊,或多或少只列出了工作区成员。
工作区是可选的,用于大型项目。只有一个包的较小项目不需要它们。在这种情况下,我们可以忽略工作区。我们在顶部有一个包,层次结构只有三层深。
包裹:然后是包裹。包是拥有真实Cargo.toml
文件的东西。包可以编译成板条箱。
Crate:crate是一个库或从包编译的可执行文件。库箱有一个lib.rs
文件作为起点。可执行包以main
函数作为起点。一个包最多可以编译为一个库和多个可执行文件。
模块:然后是模块。模块是 Rust 在源代码中组织、、 函数等项目struct
的分层方式。enum
以及如何使用它来给项目赋予唯一的名称?
答案:完全限定名称以包开头,然后是一系列模块名称,最后是项目名称。
一个例子:
serde::de::value::StringDeserializer
(请参阅此处)具有包serde
、模块路径,de
然后value
调用。struct
StringDeserializer
箱子在哪里?
该软件包serde
只有一个板条箱,即库。如果您查看软件包,Cargo.toml
则不会列出任何二进制文件。
(人们往往对包和板条箱感到困惑。即使有时我说得不准确,当我指的是包时,我说的是“serde crate”。)
简而言之:包是名称下的代码(例如serde
)。板条箱是一个库或可执行文件。