什么是包、板条箱和模块?

109*_*149 6 rust rust-cargo

我已经阅读了使用包、板条箱和模块管理不断增长的项目,但我仍然不太理解层次结构。我知道什么是 crate,并且包中应该至少有一个 crate:最多 1 个库 crate 和 0 个或更多二进制 crate。

第一:假设我想将两者lib.rsmain.rs放在包装中。如何从lib.rsin访问/调用函数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?我真的很困惑。

nal*_*ply 6

这是一个三级或四级的层次结构。

  1. 工作区(可选):顶部是工作区。工作区由一个或多个包组成。该Cargo.toml文件很特殊,或多或少只列出了工作区成员。

    工作区是可选的,用于大型项目。只有一个包的较小项目不需要它们。在这种情况下,我们可以忽略工作区。我们在顶部有一个包,层次结构只有三层深。

  2. 包裹:然后是包裹。包是拥有真实Cargo.toml文件的东西。包可以编译成板条箱。

  3. Cratecrate是一个库或从包编译的可执行文件。库箱有一个lib.rs文件作为起点。可执行包以main函数作为起点。一个包最多可以编译为一个库和多个可执行文件。

  4. 模块:然后是模块。模块是 Rust 在源代码中组织、、 函数等项目struct的分层方式。enum

以及如何使用它来给项目赋予唯一的名称?

答案:完全限定名称以包开头,然后是一系列模块名称,最后是项目名称。

一个例子:

serde::de::value::StringDeserializer请参阅此处)具有包serde、模块路径,de然后value调用。structStringDeserializer

箱子在哪里?

该软件包serde只有一个板条箱,即库。如果您查看软件包,Cargo.toml则不会列出任何二进制文件。

(人们往往对包和板条箱感到困惑。即使有时我说得不准确,当我指的是包时,我说的是“serde crate”。)

简而言之:是名称下的代码(例如serde)。板条是一个库或可执行文件。