|
|
|
@ -2,11 +2,11 @@
|
|
|
|
|
|
|
|
|
|
> [ch01-03-hello-cargo.md](https://github.com/rust-lang/book/blob/main/src/ch01-03-hello-cargo.md)
|
|
|
|
|
> <br>
|
|
|
|
|
> commit bcab8b5f5f520a40985783082d99fbe841adf649
|
|
|
|
|
> commit 1e17bf15b12f6f7b8d1711dbd343ef8993f64baa
|
|
|
|
|
|
|
|
|
|
Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 **依赖**(*dependencies*))。
|
|
|
|
|
|
|
|
|
|
最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。所以如果使用 Cargo 来构建 “Hello, world!” 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的 Rust 程序时,你将添加依赖项,如果使用 Cargo 启动项目,则添加依赖项将更容易。
|
|
|
|
|
最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。如果使用 Cargo 来构建 “Hello, world!” 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的 Rust 程序时,你将添加依赖项,如果使用 Cargo 启动项目,则添加依赖项将更容易。
|
|
|
|
|
|
|
|
|
|
由于绝大多数 Rust 项目使用 Cargo,本书接下来的部分假设你也使用 Cargo。如果使用 [“安装”][installation] 部分介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话,可以在终端输入如下命令检查是否安装了 Cargo:
|
|
|
|
|
|
|
|
|
@ -25,7 +25,7 @@ $ cargo new hello_cargo
|
|
|
|
|
$ cd hello_cargo
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
第一行命令新建了名为 *hello_cargo* 的目录。我们将项目命名为 *hello_cargo*,同时 Cargo 在一个同名目录中创建项目文件。
|
|
|
|
|
第一行命令新建了名为 *hello_cargo* 的目录和项目。我们将项目命名为 *hello_cargo*,同时 Cargo 在一个同名目录中创建项目文件。
|
|
|
|
|
|
|
|
|
|
进入 *hello_cargo* 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录:一个 *Cargo.toml* 文件,一个 *src* 目录,以及位于 *src* 目录中的 *main.rs* 文件。
|
|
|
|
|
|
|
|
|
@ -68,7 +68,7 @@ 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 帮助你保持项目干净整洁,一切井井有条。
|
|
|
|
|
|
|
|
|
@ -84,7 +84,7 @@ $ cargo build
|
|
|
|
|
Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这个命令会创建一个可执行文件 *target/debug/hello_cargo* (在 Windows 上是 *target\debug\hello_cargo.exe*),而不是放在目前目录下。可以通过这个命令运行可执行文件:
|
|
|
|
|
这个命令会创建一个可执行文件 *target/debug/hello_cargo* (在 Windows 上是 *target\debug\hello_cargo.exe*),而不是放在目前目录下。由于默认的构建方法是调试构建(debug build),Cargo 会将可执行文件放在名为 *debug* 的目录中。可以通过这个命令运行可执行文件:
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
|
$ ./target/debug/hello_cargo # 或者在 Windows 下为 .\target\debug\hello_cargo.exe
|
|
|
|
@ -102,7 +102,9 @@ $ cargo run
|
|
|
|
|
Hello, world!
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
注意这一次并没有出现表明 Cargo 正在编译 `hello_cargo` 的输出。Cargo 发现文件并没有被改变,就直接运行了二进制文件。如果修改了源文件的话,Cargo 会在运行之前重新构建项目,并会出现像这样的输出:
|
|
|
|
|
比起要记得运行 `cargo build` 之后再用可执行文件的完整路径来运行程序,使用 `cargo run` 可以实现完全相同的效果,而且要方便得多,所以大多数开发者会使用 `cargo run`。
|
|
|
|
|
|
|
|
|
|
注意这一次并没有出现表明 Cargo 正在编译 `hello_cargo` 的输出。Cargo 发现文件并没有被改变,所以它并没有重新编译,而是直接运行了可执行文件。如果修改了源文件的话,Cargo 会在运行之前重新构建项目,并会出现像这样的输出:
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
|
$ cargo run
|
|
|
|
@ -120,10 +122,11 @@ $ cargo check
|
|
|
|
|
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
为什么你会不需要可执行文件呢?通常 `cargo check` 要比 `cargo build` 快得多,因为它省略了生成可执行文件的步骤。如果你在编写代码时持续的进行检查,`cargo check` 会加速开发!为此很多 Rustaceans 编写代码时定期运行 `cargo check` 确保它们可以编译。当准备好使用可执行文件时才运行 `cargo build`。
|
|
|
|
|
为什么你会不需要可执行文件呢?通常 `cargo check` 要比 `cargo build` 快得多,因为它省略了生成可执行文件的步骤。如果你在编写代码时持续的进行检查,`cargo check` 可以让你快速了解现在的代码能不能正常通过编译!为此很多 Rustaceans 编写代码时定期运行 `cargo check` 确保它们可以编译。当准备好使用可执行文件时才运行 `cargo build`。
|
|
|
|
|
|
|
|
|
|
我们回顾下已学习的 Cargo 内容:
|
|
|
|
|
|
|
|
|
|
* 可以使用 `cargo new` 创建项目。
|
|
|
|
|
* 可以使用 `cargo build` 构建项目。
|
|
|
|
|
* 可以使用 `cargo run` 一步构建并运行项目。
|
|
|
|
|
* 可以使用 `cargo check` 在不生成二进制文件的情况下构建项目来检查错误。
|
|
|
|
@ -137,7 +140,7 @@ $ cargo check
|
|
|
|
|
|
|
|
|
|
### 把 Cargo 当作习惯
|
|
|
|
|
|
|
|
|
|
对于简单项目, Cargo 并不比 `rustc` 提供了更多的优势,不过随着开发的深入,终将证明其价值。对于拥有多个 crate 的复杂项目,交给 Cargo 来协调构建将简单的多。
|
|
|
|
|
对于简单项目, Cargo 并不比 `rustc` 提供了更多的优势,不过随着开发的深入,终将证明其价值。一旦程序壮大到由多个文件组成,亦或者是需要其他的依赖,让 Cargo 协调构建过程就会简单得多。
|
|
|
|
|
|
|
|
|
|
即便 `hello_cargo` 项目十分简单,它现在也使用了很多在你之后的 Rust 生涯将会用到的实用工具。其实,要在任何已存在的项目上工作时,可以使用如下命令通过 Git 检出代码,移动到该项目目录并构建:
|
|
|
|
|
|
|
|
|
|