Update src/ch01-03-hello-cargo.md

This commit is contained in:
Aaran Xu 2021-11-25 03:24:28 +08:00
parent fdd65ac3ea
commit 6519ea6ba2

View File

@ -1,8 +1,8 @@
## Hello, Cargo!
Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库编译这些库。(我们把代码所需要的库叫做 **依赖***dependencies*))。
Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库,以及编译这些库。(我们把代码所需要的库叫做**依赖***dependencies*))。
最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。所以如果使用 Cargo 来构建 “Hello, world!” 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的 Rust 程序时,你将添加依赖项,如果使用 Cargo 启动项目,则添加依赖项将更容易。
最简单的 Rust 程序(如我们刚刚编写的)不含任何依赖。所以如果使用 Cargo 来构建 “Hello, world!” 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的 Rust 程序时,你将添加依赖项,如果使用 Cargo 启动项目,则添加依赖项将更容易。
由于绝大多数 Rust 项目使用 Cargo本书接下来的部分假设你也使用 Cargo。如果使用 [“安装”][installation]<!-- ignore --> 部分介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话可以在终端输入如下命令检查是否安装了 Cargo
@ -14,7 +14,7 @@ $ cargo --version
### 使用 Cargo 创建项目
我们使用 Cargo 创建一个新项目,然后看看与上面的 Hello, world! 项目有什么不同。回到 *projects* 目录(或者你存放代码的目录)。接,可在任何操作系统下运行以下命令:
我们使用 Cargo 创建一个新项目,然后看看与上面的 Hello, world! 项目有什么不同。回到 *projects* 目录(或者你存放代码的目录)。接下来,可在任何操作系统下运行以下命令:
```console
$ cargo new hello_cargo
@ -25,9 +25,9 @@ $ cd hello_cargo
进入 *hello_cargo* 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录:一个 *Cargo.toml* 文件,一个 *src* 目录,以及位于 *src* 目录中的 *main.rs* 文件。
它也在 *hello_cargo* 目录初始化了一个 Git 仓库,以及一个 *.gitignore* 文件。如果您 `cargo new` 在现有的 Git 仓库中运行,则不会生成 Git 文件;您可以使用 `cargo new --vcs=git` 来覆盖此行为。
它也在 *hello_cargo* 目录初始化了一个 Git 仓库,并带有一个 *.gitignore* 文件。如果在现有的 Git 仓库中运行 `cargo new`,则不会生成 Git 文件;你可以使用 `cargo new --vcs=git` 来覆盖此行为。
> 注意Git 是一个常用的版本控制系统version control system VCS。可以通过 `--vcs` 参数使 `cargo new` 切换到其它版本控制系统,或者不使用 VCS。运行 `cargo new --help` 看可用的选项。
> 注意Git 是一个常用的版本控制系统version control system VCS。可以通过 `--vcs` 参数使 `cargo new` 切换到其它版本控制系统,或者不使用 VCS。运行 `cargo new --help` 看可用的选项。
使用你喜欢的文本编辑器打开 *Cargo.toml* 文件。它应该看起来如示例 1-2 所示:
@ -37,7 +37,6 @@ $ cd hello_cargo
[package]
name = "hello_cargo"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]
edition = "2018"
[dependencies]
@ -45,13 +44,13 @@ edition = "2018"
<span class="caption">示例 1-2*cargo new* 命令生成的 *Cargo.toml* 的内容</span>
这个文件使用 [*TOML*](https://toml.io)<!-- ignore --> (*Tom's Obvious, Minimal Language*) 格式,这是 Cargo 配置文件的格式。
文件使用 [*TOML*](https://toml.io)<!-- ignore --> (*Tom's Obvious, Minimal Language*) 格式,这是 Cargo 配置文件的格式。
第一行,`[package]`,是一个片段section标题表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息还将增加其他片段section
第一行,`[package]`,是一个表块section标题表明下面的语句用来配置一个包package。随着我们在这个文件增加更多的信息,还将增加其他表块
接下来的四行设置了 Cargo 编译程序所需的配置:项目的名称、版本、作者以及要使用的 Rust 版本。Cargo 从环境中获取你的名字和 email 信息,所以如果这些信息不正确,请修改并保存此文件。附录 E 会介绍 `edition`译注Rust 的核心版本,即 2015、2018、2021 版等) 的值。
接下来的三行设置了 Cargo 编译程序所需的配置:项目的名称、版本,以及使用的 Rust 大版本号edition区别于 version。附录 E 会介绍 `edition`译注Rust 的核心版本,即 2015、2018、2021 版等) 的值。
最后一行的 `[dependencies]` 是罗列项目依赖的片段的开始。在 Rust 中,代码包被称为 *crate*。这个项目并不需要其他的 crate不过在第 2 章的第一个项目会用到依赖,那时会用得上这个片段
最后一行的 `[dependencies]` 是罗列项目依赖的表块的开始。在 Rust 中,代码包被称为 *crate*。这个项目并不需要其他的 crate不过在第 2 章的第一个项目会用到依赖,那时会用得上这个表块
现在打开 *src/main.rs* 看看:
@ -63,11 +62,11 @@ fn main() {
}
```
Cargo 生成了一个 “Hello, world!” 程序,正如我们之前编写的示例 1-1到目前为止之前项目与 Cargo 生成项目的区别是 Cargo 将代码放在 *src* 目录,同时项目根目录包含一个 *Cargo.toml* 配置文件。
Cargo 生成了一个 “Hello, world!” 程序,正如我们之前编写的示例 1-1到目前为止之前项目与 Cargo 生成项目的区别是Cargo 将代码放在 *src* 目录,同时项目根目录包含一个 *Cargo.toml* 配置文件。
Cargo 期望源文件存放在 *src* 目录中。项目根目录只存放说明文件README、许可协议license信息、配置文件和其他跟代码无关的文件。使用 Cargo 可帮助你保持项目干净整洁,一切井井有条。
对于没有使用 Cargo 开始项目,比如我们创建的 Hello,world! 项目,你可以将其转化为一个 Cargo 项目。将代码放入 *src* 目录,并创建一个合适的 *Cargo.toml* 文件。
对于没有使用 Cargo 开始项目,比如我们之前创建的 Hello,world! 项目,你可以将其转化为一个 Cargo 项目。将代码放入 *src* 目录,并创建一个合适的 *Cargo.toml* 文件。
### 构建并运行 Cargo 项目
@ -88,7 +87,7 @@ Hello, world!
如果一切顺利,终端上应该会打印出 `Hello, world!`。首次运行 `cargo build` 时,也会使 Cargo 在项目根目录创建一个新文件:*Cargo.lock*。这个文件记录项目依赖的实际版本。这个项目并没有依赖,所以其内容比较少。你自己永远也不需要碰这个文件,让 Cargo 处理它就行了。
我们刚刚使用 `cargo build` 构建了项目,并使用 `./target/debug/hello_cargo` 运行了程序,也可以使用 `cargo run` 在一个命令中同时编译并运行生成的可执行文件:
我们刚刚使用 `cargo build` 构建了项目,并使用 `./target/debug/hello_cargo` 运行了程序,也可以使用 `cargo run` 在一个命令中同时编译代码并运行生成的可执行文件:
```console
$ cargo run
@ -124,13 +123,13 @@ $ cargo check
* 可以使用 `cargo check` 构建项目而无需生成二进制文件来检查错误。
* 有别于将构建结果放在与源码相同的目录Cargo 会将其放到 *target/debug* 目录。
使用 Cargo 的一个额外的优点是,不管你使用什么操作系统,其命令都是一样的。所以从现在开始本书将不再为 Linux 和 macOS 以及 Windows 提供平台特定的命令。
使用 Cargo 的一个额外的优点是,不管你使用什么操作系统,其命令都是一样的。所以从现在开始本书将不再为 Linux 、macOS 或 Windows 提供平台特定的命令。
### 发布构建
当项目最终准备好发布时,可以使用 `cargo build --release` 来优化编译项目。这会在 *target/release* 而不是 *target/debug* 下生成可执行文件。这些优化可以让 Rust 代码运行的更快,不过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置:一种是为了开发,你需要经常快速重新构建;另一种是为用户构建最终程序,它们不会经常重新构建,并且希望程序运行得越快越好。如果你要对代码运行时间进行基准测试,请确保运行 `cargo build --release` 并使用 *target/release* 下的可执行文件进行测试。
### Cargo 当作习惯
### 使用 Cargo 当作习惯
对于简单项目, Cargo 并不比 `rustc` 提供了更多的优势,不过随着开发的深入,终将证明其价值。对于拥有多个 crate 的复杂项目,交给 Cargo 来协调构建将简单的多。