|
|
|
@ -266,10 +266,10 @@ Cargo 对外部 crate 的运用是其真正闪光的地方。在我们使用 `ra
|
|
|
|
|
```toml
|
|
|
|
|
[dependencies]
|
|
|
|
|
|
|
|
|
|
rand = "0.5.5"
|
|
|
|
|
rand = "0.8.3"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
在 *Cargo.toml* 文件中,标题以及之后的内容属同一个片段,直到遇到下一个标题才开始新的片段。`[dependencies]` 片段告诉 Cargo 本项目依赖了哪些外部 crate 及其版本。本例中,我们使用语义化版本 `0.5.5` 来指定 `rand` crate。Cargo 理解[语义化版本(Semantic Versioning)][semver]<!-- ignore -->(有时也称为 *SemVer*),这是一种定义版本号的标准。`0.5.5` 事实上是 `^0.5.5` 的简写,它表示 “任何与 0.5.5 版本公有 API 相兼容的版本”。
|
|
|
|
|
在 *Cargo.toml* 文件中,标题以及之后的内容属同一个片段,直到遇到下一个标题才开始新的片段。`[dependencies]` 片段告诉 Cargo 本项目依赖了哪些外部 crate 及其版本。本例中,我们使用语义化版本 `0.8.3` 来指定 `rand` crate。Cargo 理解[语义化版本(Semantic Versioning)][semver]<!-- ignore -->(有时也称为 *SemVer*),这是一种定义版本号的标准。`0.8.3` 事实上是 `^0.8.3` 的简写,它表示 “任何与 0.8.3 版本公有 API 相兼容的版本”。
|
|
|
|
|
|
|
|
|
|
[semver]: http://semver.org
|
|
|
|
|
|
|
|
|
@ -278,18 +278,22 @@ rand = "0.5.5"
|
|
|
|
|
```text
|
|
|
|
|
$ cargo build
|
|
|
|
|
Updating crates.io index
|
|
|
|
|
Downloaded rand v0.5.5
|
|
|
|
|
Downloaded libc v0.2.62
|
|
|
|
|
Downloaded rand_core v0.2.2
|
|
|
|
|
Downloaded rand_core v0.3.1
|
|
|
|
|
Downloaded rand_core v0.4.2
|
|
|
|
|
Compiling rand_core v0.4.2
|
|
|
|
|
Compiling libc v0.2.62
|
|
|
|
|
Compiling rand_core v0.3.1
|
|
|
|
|
Compiling rand_core v0.2.2
|
|
|
|
|
Compiling rand v0.5.5
|
|
|
|
|
Downloaded rand v0.8.3
|
|
|
|
|
Downloaded libc v0.2.86
|
|
|
|
|
Downloaded getrandom v0.2.2
|
|
|
|
|
Downloaded cfg-if v1.0.0
|
|
|
|
|
Downloaded ppv-lite86 v0.2.10
|
|
|
|
|
Downloaded rand_chacha v0.3.0
|
|
|
|
|
Downloaded rand_core v0.6.2
|
|
|
|
|
Compiling rand_core v0.6.2
|
|
|
|
|
Compiling libc v0.2.86
|
|
|
|
|
Compiling getrandom v0.2.2
|
|
|
|
|
Compiling cfg-if v1.0.0
|
|
|
|
|
Compiling ppv-lite86 v0.2.10
|
|
|
|
|
Compiling rand_chacha v0.3.0
|
|
|
|
|
Compiling rand v0.8.3
|
|
|
|
|
Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
|
|
|
|
|
Finished dev [unoptimized + debuginfo] target(s) in 2.53 s
|
|
|
|
|
Finished dev [unoptimized + debuginfo] target(s) in 2.53s
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
<span class="caption">示例 2-2: 将 rand crate 添加为依赖之后运行 `cargo build` 的输出</span>
|
|
|
|
@ -316,30 +320,30 @@ $ cargo build
|
|
|
|
|
|
|
|
|
|
#### *Cargo.lock* 文件确保构建是可重现的
|
|
|
|
|
|
|
|
|
|
Cargo 有一个机制来确保任何人在任何时候重新构建代码,都会产生相同的结果:Cargo 只会使用你指定的依赖版本,除非你又手动指定了别的。例如,如果下周 `rand` crate 的 `0.5.6` 版本出来了,它修复了一个重要的 bug,同时也含有一个会破坏代码运行的缺陷,这时会发生什么呢?
|
|
|
|
|
Cargo 有一个机制来确保任何人在任何时候重新构建代码,都会产生相同的结果:Cargo 只会使用你指定的依赖版本,除非你又手动指定了别的。例如,如果下周 `rand` crate 的 `0.8.4` 版本出来了,它修复了一个重要的 bug,同时也含有一个会破坏代码运行的缺陷,这时会发生什么呢?
|
|
|
|
|
|
|
|
|
|
这个问题的答案是 *Cargo.lock* 文件。它在第一次运行 `cargo build` 时创建,并放在 *guessing_game* 目录。当第一次构建项目时,Cargo 计算出所有符合要求的依赖版本并写入 *Cargo.lock* 文件。当将来构建项目时,Cargo 会发现 *Cargo.lock* 已存在并使用其中指定的版本,而不是再次计算所有的版本。这使得你拥有了一个自动化的可重现的构建。换句话说,项目会持续使用 `0.5.5` 直到你显式升级,多亏有了 *Cargo.lock* 文件。
|
|
|
|
|
这个问题的答案是 *Cargo.lock* 文件。它在第一次运行 `cargo build` 时创建,并放在 *guessing_game* 目录。当第一次构建项目时,Cargo 计算出所有符合要求的依赖版本并写入 *Cargo.lock* 文件。当将来构建项目时,Cargo 会发现 *Cargo.lock* 已存在并使用其中指定的版本,而不是再次计算所有的版本。这使得你拥有了一个自动化的可重现的构建。换句话说,项目会持续使用 `0.8.4` 直到你显式升级,多亏有了 *Cargo.lock* 文件。
|
|
|
|
|
|
|
|
|
|
#### 更新 crate 到一个新版本
|
|
|
|
|
|
|
|
|
|
当你 **确实** 需要升级 crate 时,Cargo 提供了另一个命令,`update`,它会忽略 *Cargo.lock* 文件,并计算出所有符合 *Cargo.toml* 声明的最新版本。如果成功了,Cargo 会把这些版本写入 *Cargo.lock* 文件。
|
|
|
|
|
|
|
|
|
|
不过,Cargo 默认只会寻找大于 `0.5.5` 而小于 `0.6.0` 的版本。如果 `rand` crate 发布了两个新版本,`0.5.6` 和 `0.6.0`,在运行 `cargo update` 时会出现如下内容:
|
|
|
|
|
不过,Cargo 默认只会寻找大于 `0.8.3` 而小于 `0.9.0` 的版本。如果 `rand` crate 发布了两个新版本,`0.8.4` 和 `0.9.0`,在运行 `cargo update` 时会出现如下内容:
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
$ cargo update
|
|
|
|
|
Updating crates.io index
|
|
|
|
|
Updating rand v0.5.5 -> v0.5.6
|
|
|
|
|
Updating rand v0.8.3 -> v0.8.4
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这时,你也会注意到的 *Cargo.lock* 文件中的变化无外乎现在使用的 `rand` crate 版本是`0.5.6`
|
|
|
|
|
|
|
|
|
|
如果想要使用 `0.6.0` 版本的 `rand` 或是任何 `0.6.x` 系列的版本,必须像这样更新 *Cargo.toml* 文件:
|
|
|
|
|
如果想要使用 `0.9.0` 版本的 `rand` 或是任何 `0.9.x` 系列的版本,必须像这样更新 *Cargo.toml* 文件:
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
[dependencies]
|
|
|
|
|
|
|
|
|
|
rand = "0.6.0"
|
|
|
|
|
rand = "0.9.0"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
下一次运行 `cargo build` 时,Cargo 会从 registry 更新可用的 crate,并根据你指定的新版本重新计算。
|
|
|
|
|