# 包、代码箱与模组

当咱们编写大型程序时，组织咱们的代码将变得日益重要。通过分组相关的功能并根据不同特性分离代码，咱们将清楚可于何处找到实现某一特定特性的代码，以及在哪里可以修改某一特性的工作方式。

到目前为止，我们已编写的程序都在一个文件的一个模组中。随着项目增长，咱们应通过把代码拆分为多个模组，然后拆分为多个文件来组织代码。一个包可以包含多个二进制代码箱，也可以包含一个库代码箱。随着包的增长，咱们可提取各个部分到单独的代码箱，而成为外部依赖项。这一章介绍所有这些技巧。对于由一组共同发展互相关联的包组成的超大型项目，Cargo 提供了 *工作空间，workspaces*，我们将在第 14 章中的 [Cargo 工作空间](../crates-io/workspace.md) 小节中介绍。

我们还将讨论对实现细节进行封装，这让咱们可在更高级别重用代码：一旦咱们实现了某项操作，其他代码可以通过其公共接口调用咱们的代码，而不必了解该实现的工作原理。咱们编写代码的方式，定义了哪些部分属于公开供其他代码使用的，以及哪些部分属于咱们保留更改权利的私有实现细节。这是对咱们必须记住的细节数量有所限制的另一方式。

一个相关的概念是作用域：代码写下之处的嵌套上下文，都有一组被定义为 “在作用域中” 的名字。在阅读、编写及编译代码时，程序员和编译器都需要知道，某个特定点位上的某一特定名字，是否引用了某个变量、函数、结构体、枚举、模组、常量，或其他项目及该项目的含义。咱们可以创建作用域，并改变哪些名字在作用域内或在作用域外。在同一个作用域中，咱们不能有两个同名的项目；有一些可用于解决名字冲突的工具。

Rust 有着数项可以让咱们管理咱们代码的组织的特性，包括哪些细节会暴露，哪些细节属于私有的，以及咱们程序中的各个作用域中都有哪些名字。这些特性有时统称为 *模组系统，module system*，包括：

- **包，package**：让咱们构建、测试和共享代码箱的 Cargo 特性；
- **代码箱，crate**：产生库或可执行程序的模组树；
- **模组，module** 与 **`use` 关键字**：让咱们可以控制路径的组织、作用域及隐私；
- **路径，path**：命名项目的一种方式，例如结构体、函数或模组。

在这一章中，我们将介绍所有这些特性，讨论他们如何交互，并解释如何使用他们来管理作用域。到本章结束时，咱们应对模组系统有扎实了解，并能像专业人士一样，使用作用域！


