## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# 依赖

大多数程序都依赖于一些库。如果你曾经手动管理过依赖，你就知道这有多么痛苦。幸运的是，Rust 生态系统标配了 `cargo`！`cargo` 可以为项目管理依赖。

要创建一个新的 Rust 项目，可以使用以下命令：

    # 创建二进制项目
    cargo new foo

    # 创建库项目
    cargo new --lib bar

在本章的剩余部分，我们假设我们正在创建一个二进制项目，而不是一个库项目，但所有的概念都是相同的。

执行上述命令后，你应该会看到如下的文件结构：

    .
    ├── bar
    │   ├── Cargo.toml
    │   └── src
    │       └── lib.rs
    └── foo
        ├── Cargo.toml
        └── src
            └── main.rs

`main.rs` 是你新建的 `foo` 项目的主源文件 —— 这一点没什么新鲜的。`Cargo.toml` 则是这个项目的 `cargo` 配置文件。如果你查看它的内容，应该会看到类似这样的内容：

    [package]
    name = "foo"
    version = "0.1.0"
    authors = ["mark"]

    [dependencies]

`[package]` 下的 `name` 字段决定了项目的名称。如果你将 crate 发布到 `crates.io`（稍后会详细介绍），这个名称将被使用。同时，它也是编译时生成的二进制文件的名称。

`version` 字段是使用语义化版本控制的 crate 版本号。

`authors` 字段是发布 crate 时使用的作者列表。

`[dependencies]` 部分允许你为项目添加依赖。

举个例子，假设我们想让程序拥有一个出色的命令行界面（CLI）。你可以在 crates.io（Rust 官方包注册中心）上找到许多优秀的包。其中，clap 是一个广受欢迎的选择。在撰写本文时，`clap` 的最新发布版本是 `2.27.1`。要在我们的程序中添加这个依赖，只需在 `Cargo.toml` 的 `[dependencies]` 下添加：`clap = "2.27.1"`。就这么简单！现在你就可以在程序中使用 `clap` 了。

`cargo` 还支持其他类型的依赖。这里给出一个简单的示例：

    [package]
    name = "foo"
    version = "0.1.0"
    authors = ["mark"]

    [dependencies]
    clap = "2.27.1" # 来自 crates.io
    rand = { git = "https://github.com/rust-lang-nursery/rand" } # 来自在线仓库
    bar = { path = "../bar" } # 来自本地文件系统的路径

`cargo` 不仅仅是一个依赖管理器。`Cargo.toml` 的格式规范中列出了所有可用的配置选项。

我们可以在项目目录的任何位置（包括子目录！）执行 `cargo build` 来构建项目。也可以使用 `cargo run` 来构建并运行。请注意，这些命令会解析所有依赖，必要时下载 crate，并构建所有内容，包括你的 crate。（值得一提的是，它只会重新构建尚未构建的部分，类似于 `make`）。

瞧！就是这么简单！