pull/678/head
sunface 3 years ago
commit 5c948a626f

@ -320,7 +320,7 @@ hello_macro_derive = { path = "../hello_macro/hello_macro_derive" }
# hello_macro_derive = { path = "./hello_macro_derive" } # hello_macro_derive = { path = "./hello_macro_derive" }
``` ```
此时,`hello_macro` 项目就可以成功的引用到 `hello_macro_derive` 本地包了,对于项目依赖引入的详细介绍,可以参见 [Cargo 章节](https://course.rs/toolchains/cargo/dependency.html)。 此时,`hello_macro` 项目就可以成功的引用到 `hello_macro_derive` 本地包了,对于项目依赖引入的详细介绍,可以参见 [Cargo 章节](https://course.rs/cargo/dependency.html)。
接下来,就到了重头戏环节,一起来看看该如何定义过程宏。 接下来,就到了重头戏环节,一起来看看该如何定义过程宏。

@ -209,7 +209,7 @@ fn main() {
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }
``` ```
里面有个 `features = ["full"]` 可能大家会比较迷惑,当然,关于它的具体解释在本书的 [Cargo 详解专题](https://course.rs/toolchains/cargo/intro.html) 有介绍,这里就简单进行说明, 里面有个 `features = ["full"]` 可能大家会比较迷惑,当然,关于它的具体解释在本书的 [Cargo 详解专题](https://course.rs/cargo/intro.html) 有介绍,这里就简单进行说明,
`Tokio` 有很多功能和特性,例如 `TCP``UDP``Unix sockets`,同步工具,多调度类型等等,不是每个应用都需要所有的这些特性。为了优化编译时间和最终生成可执行文件大小、内存占用大小,应用可以对这些特性进行可选引入。 `Tokio` 有很多功能和特性,例如 `TCP``UDP``Unix sockets`,同步工具,多调度类型等等,不是每个应用都需要所有的这些特性。为了优化编译时间和最终生成可执行文件大小、内存占用大小,应用可以对这些特性进行可选引入。

@ -1,6 +1,6 @@
# 构建( Build )缓存 # 构建( Build )缓存
`cargo build` 的结果会被放入项目根目录下的 `target` 文件夹中,当然,这个位置可以三种方式更改:设置 `CARGO_TARGET_DIR` [环境变量](https://doc.rust-lang.org/stable/cargo/reference/environment-variables.html)、[`build.target-dir`](https://course.rs/toolchains/cargo/reference/configuration.html#配置文件概览) 配置项以及 `--target-dir` 命令行参数。 `cargo build` 的结果会被放入项目根目录下的 `target` 文件夹中,当然,这个位置可以三种方式更改:设置 `CARGO_TARGET_DIR` [环境变量](https://doc.rust-lang.org/stable/cargo/reference/environment-variables.html)、[`build.target-dir`](https://course.rs/cargo/reference/configuration.html#配置文件概览) 配置项以及 `--target-dir` 命令行参数。
## target 目录结构 ## target 目录结构
@ -8,7 +8,7 @@
#### 不使用 --target #### 不使用 --target
`--target` 标志没有指定,`Cargo` 会根据宿主机架构进行构建,构建结果会放入项目根目录下的 `target` 目录中,`target` 下每个子目录中包含了相应的 [`发布配置profile`](https://course.rs/toolchains/cargo/reference/profiles.html) 的构建结果,例如 `release`、`debug` 是自带的`profile`,前者往往用于生产环境,因为会做大量的性能优化,而后者则用于开发环境,此时的编译效率和报错信息是最好的。 `--target` 标志没有指定,`Cargo` 会根据宿主机架构进行构建,构建结果会放入项目根目录下的 `target` 目录中,`target` 下每个子目录中包含了相应的 [`发布配置profile`](https://course.rs/cargo/reference/profiles.html) 的构建结果,例如 `release`、`debug` 是自带的`profile`,前者往往用于生产环境,因为会做大量的性能优化,而后者则用于开发环境,此时的编译效率和报错信息是最好的。
除此之外我们还可以定义自己想要的 `profile` ,例如用于测试环境的 `profile` `test`,用于预发环境的 `profile` `pre-prod` 等。 除此之外我们还可以定义自己想要的 `profile` ,例如用于测试环境的 `profile` `test`,用于预发环境的 `profile` `pre-prod` 等。
@ -33,7 +33,7 @@
| `target/<triple>/debug/` | `target/thumbv7em-none-eabihf/debug/` | | `target/<triple>/debug/` | `target/thumbv7em-none-eabihf/debug/` |
| `target/<triple>/release/` | `target/thumbv7em-none-eabihf/release/` | | `target/<triple>/release/` | `target/thumbv7em-none-eabihf/release/` |
> **注意:**,当没有使用 `--target` 时,`Cargo` 会与构建脚本和过程宏一起共享你的依赖包,对于每个 `rustc` 命令调用而言,[`RUSTFLAGS`](https://course.rs/toolchains/cargo/reference/configuration.html#配置文件概览) 也将被共享。 > **注意:**,当没有使用 `--target` 时,`Cargo` 会与构建脚本和过程宏一起共享你的依赖包,对于每个 `rustc` 命令调用而言,[`RUSTFLAGS`](https://course.rs/cargo/reference/configuration.html#配置文件概览) 也将被共享。
> >
> 而使用 `--target` 后,构建脚本、过程宏会针对宿主机的 CPU 架构进行各自构建,且不会共享 `RUSTFLAGS` > 而使用 `--target` 后,构建脚本、过程宏会针对宿主机的 CPU 架构进行各自构建,且不会共享 `RUSTFLAGS`
@ -43,8 +43,8 @@
| 目录 | 描述 | | 目录 | 描述 |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| `target/debug/` | 包含编译后的输出,例如二进制可执行文件、[库对象( library target )](https://course.rs/toolchains/cargo/reference/cargo-target.html#库对象library) | | `target/debug/` | 包含编译后的输出,例如二进制可执行文件、[库对象( library target )](https://course.rs/cargo/reference/cargo-target.html#库对象library) |
| `target/debug/examples/` | 包含[示例对象( example target )](https://course.rs/toolchains/cargo/reference/cargo-target.html#示例对象examples) | | `target/debug/examples/` | 包含[示例对象( example target )](https://course.rs/cargo/reference/cargo-target.html#示例对象examples) |
还有一些命令会在 `target` 下生成自己的独立目录: 还有一些命令会在 `target` 下生成自己的独立目录:
@ -58,8 +58,8 @@ Cargo 还会创建几个用于构建过程的其它类型目录,它们的目
| 目录 | 描述 | | 目录 | 描述 |
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | -------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `target/debug/deps` | 依赖和其它输出成果 | | `target/debug/deps` | 依赖和其它输出成果 |
| `target/debug/incremental` | `rustc` [增量编译](https://course.rs/toolchains/cargo/reference/profiles.html#incremental)的输出,该缓存可以用于提升后续的编译速度 | | `target/debug/incremental` | `rustc` [增量编译](https://course.rs/cargo/reference/profiles.html#incremental)的输出,该缓存可以用于提升后续的编译速度 |
| `target/debug/build/` | [构建脚本](https://course.rs/toolchains/cargo/reference/build-script/intro.html)的输出 | | `target/debug/build/` | [构建脚本](https://course.rs/cargo/reference/build-script/intro.html)的输出 |
## 依赖信息文件 ## 依赖信息文件
@ -67,7 +67,7 @@ Cargo 还会创建几个用于构建过程的其它类型目录,它们的目
该文件往往用于提供给外部的构建系统,这样它们就可以判断 `Cargo` 命令是否需要再次被执行。 该文件往往用于提供给外部的构建系统,这样它们就可以判断 `Cargo` 命令是否需要再次被执行。
文件中的路径默认是绝对路径,你可以通过 [`build.dep-info-basedir`](https://course.rs/toolchains/cargo/reference/configuration.html#配置文件概览) 配置项来修改为相对路径。 文件中的路径默认是绝对路径,你可以通过 [`build.dep-info-basedir`](https://course.rs/cargo/reference/configuration.html#配置文件概览) 配置项来修改为相对路径。
```shell ```shell
# 关于 `.d` 文件的一个示例 : target/debug/foo.d # 关于 `.d` 文件的一个示例 : target/debug/foo.d
@ -81,4 +81,4 @@ Cargo 还会创建几个用于构建过程的其它类型目录,它们的目
为了设置 `sccache`,首先需要使用 `cargo install sccache` 进行安装,然后在调用 `Cargo` 之前将 `RUSTC_WRAPPER` 环境变量设置为 `sccache` 为了设置 `sccache`,首先需要使用 `cargo install sccache` 进行安装,然后在调用 `Cargo` 之前将 `RUSTC_WRAPPER` 环境变量设置为 `sccache`
- 如果用的 `bash`,可以将 `export RUSTC_WRAPPER=sccache` 添加到 `.bashrc` - 如果用的 `bash`,可以将 `export RUSTC_WRAPPER=sccache` 添加到 `.bashrc`
- 也可以使用 [`build.rustc-wrapper`](https://course.rs/toolchains/cargo/reference/configuration.html#配置文件概览) 配置项 - 也可以使用 [`build.rustc-wrapper`](https://course.rs/cargo/reference/configuration.html#配置文件概览) 配置项

@ -17,7 +17,7 @@ $ echo $HOME/.cargo/
## 文件 ## 文件
- `config.toml` 是 Cargo 的全局配置文件,具体请查看[这里](https://course.rs/toolchains/cargo/reference/configuration.html) - `config.toml` 是 Cargo 的全局配置文件,具体请查看[这里](https://course.rs/cargo/reference/configuration.html)
- `credentials.toml``cargo login` 提供私有化登录证书,用于登录 `package` 注册中心,例如 `crates.io` - `credentials.toml``cargo login` 提供私有化登录证书,用于登录 `package` 注册中心,例如 `crates.io`
- `.crates.toml`, `.crates2.json` 这两个是隐藏文件,包含了通过 `cargo install` 安装的包的 `package` 信息,**请不要手动修改!** - `.crates.toml`, `.crates2.json` 这两个是隐藏文件,包含了通过 `cargo install` 安装的包的 `package` 信息,**请不要手动修改!**
@ -65,7 +65,7 @@ $ echo $HOME/.cargo/
解决办法很简单: 解决办法很简单:
- 既然下载慢,那就使用[国内的注册服务](https://course.rs/toolchains/cargo/reference/specify-deps.html#从其它注册服务引入依赖包),不再使用 crates.io - 既然下载慢,那就使用[国内的注册服务](https://course.rs/cargo/reference/specify-deps.html#从其它注册服务引入依赖包),不再使用 crates.io
- 耐心等待持有锁的用户构建完成 - 耐心等待持有锁的用户构建完成
- 强行停止正在构建的进程,例如杀掉 IDE 使用的 rust-analyer 插件进程,然后删除 `$HOME/.cargo/.package_cache` 目录 - 强行停止正在构建的进程,例如杀掉 IDE 使用的 rust-analyer 插件进程,然后删除 `$HOME/.cargo/.package_cache` 目录

@ -9,7 +9,7 @@
time = "0.1.12" time = "0.1.12"
``` ```
可以看到我们指定了 `time` 包的版本号 "0.1.12",关于版本号,实际上还有其它的指定方式,具体参见[指定依赖项](https://course.rs/toolchains/cargo/reference/specify-deps.html)章节。 可以看到我们指定了 `time` 包的版本号 "0.1.12",关于版本号,实际上还有其它的指定方式,具体参见[指定依赖项](https://course.rs/cargo/reference/specify-deps.html)章节。
如果想继续添加 `regexp` 包,只需在 `time` 包后面添加即可 : 如果想继续添加 `regexp` 包,只需在 `time` 包后面添加即可 :

@ -45,5 +45,5 @@
关于 Rust 中的包和模块,[之前的章节](https://course.rs/basic/crate-module/intro.html)有更详细的解释。 关于 Rust 中的包和模块,[之前的章节](https://course.rs/basic/crate-module/intro.html)有更详细的解释。
此外,`bin`、`tests`、`examples` 等目录路径都可以通过配置文件进行配置,它们被统一称之为 [Cargo Target](https://course.rs/toolchains/cargo/reference/cargo-target.html)。 此外,`bin`、`tests`、`examples` 等目录路径都可以通过配置文件进行配置,它们被统一称之为 [Cargo Target](https://course.rs/cargo/reference/cargo-target.html)。

@ -250,7 +250,7 @@ fn test_crc32() {
} }
``` ```
代码很清晰,也很简洁,这里就不再过多介绍,运行 [`cargo build --vv`](https://course.rs/toolchains/cargo/reference/build-script/intro.html#构建脚本的输出) 来看看部分结果( 系统中需要已经安装 `libz` 库) 代码很清晰,也很简洁,这里就不再过多介绍,运行 [`cargo build --vv`](https://course.rs/cargo/reference/build-script/intro.html#构建脚本的输出) 来看看部分结果( 系统中需要已经安装 `libz` 库)
```shell ```shell
[libz-sys 0.1.0] cargo:rustc-link-search=native=/usr/lib [libz-sys 0.1.0] cargo:rustc-link-search=native=/usr/lib
@ -268,7 +268,7 @@ fn test_crc32() {
若你有一个依赖于 `zlib` 的库,那可以使用 `libz-sys` 来自动发现或构建该库。这个功能对于交叉编译非常有用,例如 Windows 下往往不会安装 `zlib` 若你有一个依赖于 `zlib` 的库,那可以使用 `libz-sys` 来自动发现或构建该库。这个功能对于交叉编译非常有用,例如 Windows 下往往不会安装 `zlib`
`libz-sys` 通过设置 [`include`](https://github.com/rust-lang/libz-sys/blob/3c594e677c79584500da673f918c4d2101ac97a1/build.rs#L156) 元数据来告知其它包去哪里找到 `zlib` 的头文件,然后我们的构建脚本可以通过 `DEP_Z_INCLUDE` 环境变量来读取 `include` 元数据( 关于元数据的传递,见[这里](https://course.rs/toolchains/cargo/reference/build-script/intro.html#links) )。 `libz-sys` 通过设置 [`include`](https://github.com/rust-lang/libz-sys/blob/3c594e677c79584500da673f918c4d2101ac97a1/build.rs#L156) 元数据来告知其它包去哪里找到 `zlib` 的头文件,然后我们的构建脚本可以通过 `DEP_Z_INCLUDE` 环境变量来读取 `include` 元数据( 关于元数据的传递,见[这里](https://course.rs/cargo/reference/build-script/intro.html#links) )。
```toml ```toml
# Cargo.toml # Cargo.toml

@ -28,9 +28,9 @@ fn main() {
- 根据某个说明描述文件生成一个 Rust 模块 - 根据某个说明描述文件生成一个 Rust 模块
- 执行一些平台相关的配置 - 执行一些平台相关的配置
下面的部分我们一起来看看构建脚本具体是如何工作的,然后在[下个章节](https://course.rs/toolchains/cargo/reference/build-script/examples.html)中还提供了一些关于如何编写构建脚本的示例。 下面的部分我们一起来看看构建脚本具体是如何工作的,然后在[下个章节](https://course.rs/cargo/reference/build-script/examples.html)中还提供了一些关于如何编写构建脚本的示例。
> Note: [`package.build`](https://course.rs/toolchains/cargo/reference/manifest.html#build) 可以用于改变构建脚本的名称,或者直接禁用该功能 > Note: [`package.build`](https://course.rs/cargo/reference/manifest.html#build) 可以用于改变构建脚本的名称,或者直接禁用该功能
#### 构建脚本的生命期 #### 构建脚本的生命期
@ -121,7 +121,7 @@ Cargo 要求一个本地库最多只能被一个项目所链接,换而言之
## 覆盖构建脚本 ## 覆盖构建脚本
`Cargo.toml` 设置了 `links` 时, Cargo 就允许我们使用自定义库对现有的构建脚本进行覆盖。在 [Cargo 使用的配置文件](https://course.rs/toolchains/cargo/reference/configuration.html)中添加以下内容: `Cargo.toml` 设置了 `links` 时, Cargo 就允许我们使用自定义库对现有的构建脚本进行覆盖。在 [Cargo 使用的配置文件](https://course.rs/cargo/reference/configuration.html)中添加以下内容:
```toml ```toml
[target.x86_64-unknown-linux-gnu.foo] [target.x86_64-unknown-linux-gnu.foo]

@ -1,6 +1,6 @@
# Cargo Target # Cargo Target
**Cargo 项目中包含有一些对象,它们包含的源代码文件可以被编译成相应的包,这些对象被称之为 Cargo Target**。例如[之前章节](https://course.rs/toolchains/cargo/guide/package-layout.html)提到的库对象 `Library` 、二进制对象 `Binary`、示例对象 `Examples`、测试对象 `Tests` 和 基准性能对象 `Benches` 都是 Cargo Target。 **Cargo 项目中包含有一些对象,它们包含的源代码文件可以被编译成相应的包,这些对象被称之为 Cargo Target**。例如[之前章节](https://course.rs/cargo/guide/package-layout.html)提到的库对象 `Library` 、二进制对象 `Binary`、示例对象 `Examples`、测试对象 `Tests` 和 基准性能对象 `Benches` 都是 Cargo Target。
本章节我们一起来看看该如何在 `Cargo.toml` 清单中配置这些对象,当然,大部分时候都无需手动配置,因为默认的配置通常由项目目录的布局自动推断出来。 本章节我们一起来看看该如何在 `Cargo.toml` 清单中配置这些对象,当然,大部分时候都无需手动配置,因为默认的配置通常由项目目录的布局自动推断出来。
@ -137,7 +137,7 @@ required-features = [] # 构建对象所需的 Cargo Features (N/A for lib).
#### required-features #### required-features
该字段用于指定在构建对象时所需的 [`features`](https://course.rs/toolchains/cargo/reference/features.html) 列表。 该字段用于指定在构建对象时所需的 [`features`](https://course.rs/cargo/reference/features.html) 列表。
该字段只对 `[[bin]]``[[bench]]``[[test]]``[[example]]` 有效,对于 `[lib]` 没有任何效果。 该字段只对 `[[bin]]``[[bench]]``[[test]]``[[example]]` 有效,对于 `[lib]` 没有任何效果。
@ -155,7 +155,7 @@ required-features = ["postgres", "tools"]
## 对象自动发现 ## 对象自动发现
默认情况下,`Cargo` 会基于项目的[目录文件布局](https://course.rs/toolchains/cargo/guide/package-layout.html)自动发现和确定对象,而之前的配置项则允许我们对其进行手动的配置修改(若项目布局跟标准的不一样时)。 默认情况下,`Cargo` 会基于项目的[目录文件布局](https://course.rs/cargo/guide/package-layout.html)自动发现和确定对象,而之前的配置项则允许我们对其进行手动的配置修改(若项目布局跟标准的不一样时)。
而这种自动发现对象的设定可以通过以下配置来禁用: 而这种自动发现对象的设定可以通过以下配置来禁用:

@ -1,6 +1,6 @@
# 通过 config.toml 对 Cargo 进行配置 # 通过 config.toml 对 Cargo 进行配置
Cargo 相关的配置有两种,第一种是对自身进行配置,第二种是对指定的项目进行配置,关于后者请查看 [Cargo.toml 清单](https://course.rs/toolchains/cargo/reference/manifest.html)。对于普通用户而言第二种才是我们最常使用的。 Cargo 相关的配置有两种,第一种是对自身进行配置,第二种是对指定的项目进行配置,关于后者请查看 [Cargo.toml 清单](https://course.rs/cargo/reference/manifest.html)。对于普通用户而言第二种才是我们最常使用的。
本文讲述的是如何对 Cargo 相关的工具进行配置,该配置中的部分内容可能会覆盖掉 `Cargo.toml` 中对应的部分,例如关于 `profile` 的内容。 本文讲述的是如何对 Cargo 相关的工具进行配置,该配置中的部分内容可能会覆盖掉 `Cargo.toml` 中对应的部分,例如关于 `profile` 的内容。
@ -95,7 +95,7 @@ offline = true # 不能访问网络
[patch.<registry>] [patch.<registry>]
# Same keys as for [patch] in Cargo.toml # Same keys as for [patch] in Cargo.toml
[profile.<name>] # profile 配置,详情见"如何在 Cargo.toml 中配置 profile" : https://course.rs/toolchains/cargo/reference/profiles.html#profile设置 [profile.<name>] # profile 配置,详情见"如何在 Cargo.toml 中配置 profile" : https://course.rs/cargo/reference/profiles.html#profile设置
opt-level = 0 opt-level = 0
debug = true debug = true
split-debuginfo = '...' split-debuginfo = '...'
@ -109,7 +109,7 @@ rpath = false
[profile.<name>.build-override] [profile.<name>.build-override]
[profile.<name>.package.<name>] [profile.<name>.package.<name>]
[registries.<name>] # 设置其它的注册服务: https://course.rs/toolchains/cargo/reference/specify-deps.html#从其它注册服务引入依赖包 [registries.<name>] # 设置其它的注册服务: https://course.rs/cargo/reference/specify-deps.html#从其它注册服务引入依赖包
index = "…" # 注册服务索引列表的 URL index = "…" # 注册服务索引列表的 URL
token = "…" # 连接注册服务所需的鉴权 token token = "…" # 连接注册服务所需的鉴权 token

@ -9,7 +9,7 @@
下面我们来具体看看类似的问题该如何解决。 下面我们来具体看看类似的问题该如何解决。
> 上一章节中我们讲了如果通过[多种引用方式](https://course.rs/toolchains/cargo/reference/specify-deps/intro.html#多引用方式混合)来引入一个包,其实这也是一种依赖覆盖。 > 上一章节中我们讲了如果通过[多种引用方式](https://course.rs/cargo/reference/specify-deps/intro.html#多引用方式混合)来引入一个包,其实这也是一种依赖覆盖。
## 测试 bugfix 版本 ## 测试 bugfix 版本
@ -53,7 +53,7 @@ what is locked in the Cargo.lock file, run `cargo update` to use the new
version. This may also occur with an optional dependency that is not enabled. version. This may also occur with an optional dependency that is not enabled.
``` ```
具体原因比较复杂,但是仔细观察,会发现克隆下来的 `uuid` 的版本是 `v1.0.0-alpha.1` (在 `"../uuid/Cargo.toml"` 中可以查看),然后我们本地引入的 `uuid` 版本是 `0.8.2`,根据之前讲过的 `crates.io` 的[版本规则](https://course.rs/toolchains/cargo/reference/specify-deps/intro.html#从-cratesio-引入依赖包),这两者是不兼容的,`0.8.2` 只能升级到 `0.8.z`,例如 `0.8.3` 具体原因比较复杂,但是仔细观察,会发现克隆下来的 `uuid` 的版本是 `v1.0.0-alpha.1` (在 `"../uuid/Cargo.toml"` 中可以查看),然后我们本地引入的 `uuid` 版本是 `0.8.2`,根据之前讲过的 `crates.io` 的[版本规则](https://course.rs/cargo/reference/specify-deps/intro.html#从-cratesio-引入依赖包),这两者是不兼容的,`0.8.2` 只能升级到 `0.8.z`,例如 `0.8.3`
既然如此,我们先将 "../uuid/Cargo.toml" 中的 `version = "1.0.0-alpha.1"` 修改为 `version = "0.8.3"` ,然后看看结果先: 既然如此,我们先将 "../uuid/Cargo.toml" 中的 `version = "1.0.0-alpha.1"` 修改为 `version = "0.8.3"` ,然后看看结果先:
@ -75,7 +75,7 @@ $ cargo build
修复 bug 后,我们可以提交 pr 给 `uuid`,一旦 pr 被合并到了 `master` 分支,你可以直接通过以下方式来使用补丁: 修复 bug 后,我们可以提交 pr 给 `uuid`,一旦 pr 被合并到了 `master` 分支,你可以直接通过以下方式来使用补丁:
```shell ```toml
[patch.crates-io] [patch.crates-io]
uuid = { git = 'https://github.com/uuid-rs/uuid' } uuid = { git = 'https://github.com/uuid-rs/uuid' }
``` ```
@ -129,7 +129,7 @@ uuid = { git = 'https://github.com/uuid-rs/uuid' }
若我们想要覆盖的依赖并不是来自 `crates.io` ,就需要对 `[patch]` 做一些修改。例如依赖是 `git` 仓库,然后使用本地路径来覆盖它: 若我们想要覆盖的依赖并不是来自 `crates.io` ,就需要对 `[patch]` 做一些修改。例如依赖是 `git` 仓库,然后使用本地路径来覆盖它:
```shell ```toml
[patch."https://github.com/your/repository"] [patch."https://github.com/your/repository"]
my-library = { path = "../my-library/path" } my-library = { path = "../my-library/path" }
``` ```
@ -154,7 +154,7 @@ uuid = { git = "https://github.com/uuid-rs/uuid", branch = "2.0.0" }
这里需要注意,**与之前的小版本不同,大版本的 `patch` 不会发生间接的传递!**,例如: 这里需要注意,**与之前的小版本不同,大版本的 `patch` 不会发生间接的传递!**,例如:
```shell ```toml
[package] [package]
name = "my-binary" name = "my-binary"
version = "0.1.0" version = "0.1.0"
@ -173,7 +173,7 @@ uuid = { git = 'https://github.com/uuid-rs/uuid', branch = '2.0.0' }
## 多版本[patch] ## 多版本[patch]
在之前章节,我们介绍过如何使用 `package key` 来[重命名依赖包](https://course.rs/toolchains/cargo/reference/specify-deps/intro.html#在-cargotoml-中重命名依赖),现在来看看如何使用它同时引入多个 `patch` 在之前章节,我们介绍过如何使用 `package key` 来[重命名依赖包](https://course.rs/cargo/reference/specify-deps/intro.html#在-cargotoml-中重命名依赖),现在来看看如何使用它同时引入多个 `patch`
假设,我们对 `serde` 有两个新的 `patch` 需求: 假设,我们对 `serde` 有两个新的 `patch` 需求:
@ -196,7 +196,7 @@ serde2 = { git = 'https://github.com/example/serde', package = 'serde', branch =
有时我们只是临时性地对一个项目进行处理,因此并不想去修改它的 `Cargo.toml`。此时可以使用 `Cargo` 提供的路径覆盖方法: **注意,这个方法限制较多,如果可以,还是要使用 [patch]**。 有时我们只是临时性地对一个项目进行处理,因此并不想去修改它的 `Cargo.toml`。此时可以使用 `Cargo` 提供的路径覆盖方法: **注意,这个方法限制较多,如果可以,还是要使用 [patch]**。
`[patch]` 修改 `Cargo.toml` 不同,路径覆盖修改的是 `Cargo` 自身的[配置文件](https://course.rs/toolchains/cargo/guide/cargo-cache.html#cargo-home) `$Home/.cargo/config.toml`: `[patch]` 修改 `Cargo.toml` 不同,路径覆盖修改的是 `Cargo` 自身的[配置文件](https://course.rs/cargo/guide/cargo-cache.html#cargo-home) `$Home/.cargo/config.toml`:
```toml ```toml
paths = ["/path/to/uuid"] paths = ["/path/to/uuid"]

@ -87,7 +87,7 @@ avif = ["ravif", "rgb"]
之后,`avif` feature 一旦被启用,那这两个依赖库也将自动被引入。 之后,`avif` feature 一旦被启用,那这两个依赖库也将自动被引入。
> 注意:我们之前也讲过条件引入依赖的方法,那就是使用[平台相关的依赖](https://course.rs/toolchains/cargo/reference/specify-deps.html#根据平台引入依赖),与基于 feature 的可选依赖不同,它们是基于特定平台的可选依赖 > 注意:我们之前也讲过条件引入依赖的方法,那就是使用[平台相关的依赖](https://course.rs/cargo/reference/specify-deps.html#根据平台引入依赖),与基于 feature 的可选依赖不同,它们是基于特定平台的可选依赖
## 依赖库自身的 feature ## 依赖库自身的 feature
@ -249,11 +249,11 @@ V2 版本的解析器可以在某些情况下避免 feature 同一化的发生
## 构建脚本 ## 构建脚本
[构建脚本](https://course.rs/toolchains/cargo/reference/build-script/intro.html)可以通过 `CARGO_FEATURE_<name>` 环境变量获取启用的 `feauture` 列表,其中 `<name>` 是 feature 的名称,该名称被转换成大全写字母,且 `-` 被转换为 `_` [构建脚本](https://course.rs/cargo/reference/build-script/intro.html)可以通过 `CARGO_FEATURE_<name>` 环境变量获取启用的 `feauture` 列表,其中 `<name>` 是 feature 的名称,该名称被转换成大全写字母,且 `-` 被转换为 `_`
## required-features ## required-features
该字段可以用于禁用特定的 Cargo Target当某个 feature 没有被启用时,查看[这里](https://course.rs/toolchains/cargo/reference/cargo-target.html#required-features)获取更多信息。 该字段可以用于禁用特定的 Cargo Target当某个 feature 没有被启用时,查看[这里](https://course.rs/cargo/reference/cargo-target.html#required-features)获取更多信息。
## SemVer 兼容性 ## SemVer 兼容性

@ -26,28 +26,28 @@
- [`publish`](#the-publish-field) — 用于阻止项目的发布 - [`publish`](#the-publish-field) — 用于阻止项目的发布
- [`metadata`](#metadata) — 额外的配置信息,用于提供给外部工具 - [`metadata`](#metadata) — 额外的配置信息,用于提供给外部工具
- [`default-run`](#default-run) — [`cargo run`] 所使用的默认可执行文件( binary ) - [`default-run`](#default-run) — [`cargo run`] 所使用的默认可执行文件( binary )
- [`autobins`](cargo-target.md#对象自动发现) — 禁止可执行文件的自动发现 - [`autobins`](https://course.rs/cargo/reference/cargo-target.html#对象自动发现) — 禁止可执行文件的自动发现
- [`autoexamples`](cargo-target.md#对象自动发现) — 禁止示例文件的自动发现 - [`autoexamples`](https://course.rs/cargo/reference/cargo-target.html#对象自动发现) — 禁止示例文件的自动发现
- [`autotests`](cargo-target.md#对象自动发现) — 禁止测试文件的自动发现 - [`autotests`](https://course.rs/cargo/reference/cargo-target.html#对象自动发现) — 禁止测试文件的自动发现
- [`autobenches`](cargo-target.md#对象自动发现) — 禁止 bench 文件的自动发现 - [`autobenches`](https://course.rs/cargo/reference/cargo-target.html#对象自动发现) — 禁止 bench 文件的自动发现
- [`resolver`](resolver.md#resolver-versions) — 设置依赖解析器( dependency resolver) - [`resolver`](resolver.md#resolver-versions) — 设置依赖解析器( dependency resolver)
- Cargo Target 列表: (查看 [Target 配置](cargo-target.md#Target配置) 获取详细设置) - Cargo Target 列表: (查看 [Target 配置](https://course.rs/cargo/reference/cargo-target.html#Target配置) 获取详细设置)
- [`[lib]`](cargo-target.md#库对象library) — Library target 设置. - [`[lib]`](https://course.rs/cargo/reference/cargo-target.html#库对象library) — Library target 设置.
- [`[[bin]]`](cargo-target.md#二进制对象binaries) — Binary target 设置. - [`[[bin]]`](https://course.rs/cargo/reference/cargo-target.html#二进制对象binaries) — Binary target 设置.
- [`[[example]]`](cargo-target.md#示例对象examples) — Example target 设置. - [`[[example]]`](https://course.rs/cargo/reference/cargo-target.html#示例对象examples) — Example target 设置.
- [`[[test]]`](cargo-target.md#测试对象tests) — Test target 设置. - [`[[test]]`](https://course.rs/cargo/reference/cargo-target.html#测试对象tests) — Test target 设置.
- [`[[bench]]`](cargo-target.md#基准性能对象benches) — Benchmark target 设置. - [`[[bench]]`](https://course.rs/cargo/reference/cargo-target.html#基准性能对象benches) — Benchmark target 设置.
- Dependency tables: - Dependency tables:
- [`[dependencies]`](specify-deps.md) — 项目依赖包 - [`[dependencies]`](https://course.rs/cargo/reference/specify-deps.html) — 项目依赖包
- [`[dev-dependencies]`](specify-deps.md#dev-dependencies) — 用于 examples、tests 和 benchmarks 的依赖包 - [`[dev-dependencies]`](https://course.rs/cargo/reference/specify-deps.html#dev-dependencies) — 用于 examples、tests 和 benchmarks 的依赖包
- [`[build-dependencies]`](specify-deps.md#build-dependencies) — 用于构建脚本的依赖包 - [`[build-dependencies]`](https://course.rs/cargo/reference/specify-deps.html#build-dependencies) — 用于构建脚本的依赖包
- [`[target]`](specify-deps.md#根据平台引入依赖) — 平台特定的依赖包 - [`[target]`](https://course.rs/cargo/reference/specify-deps.html#根据平台引入依赖) — 平台特定的依赖包
- [`[badges]`](#badges) — 用于在注册服务(例如 crates.io ) 上显示项目的一些状态信息例如当前的维护状态活跃中、寻找维护者、deprecated - [`[badges]`](#badges) — 用于在注册服务(例如 crates.io ) 上显示项目的一些状态信息例如当前的维护状态活跃中、寻找维护者、deprecated
- [`[features]`](features.md) — `features` 可以用于条件编译 - [`[features]`](https://course.rs/cargo/reference/features/intro.html) — `features` 可以用于条件编译
- [`[patch]`](deps-overriding.md) — 推荐使用的依赖覆盖方式 - [`[patch]`](https://course.rs/cargo/reference/deps-overriding.html) — 推荐使用的依赖覆盖方式
- [`[replace]`](deps-overriding.md#不推荐的replace) — 不推荐使用的依赖覆盖方式 (deprecated). - [`[replace]`](https://course.rs/cargo/reference/deps-overriding.html#不推荐的replace) — 不推荐使用的依赖覆盖方式 (deprecated).
- [`[profile]`](profiles.md) — 编译器设置和优化 - [`[profile]`](https://course.rs/cargo/reference/profiles.html) — 编译器设置和优化
- [`[workspace]`](workspaces.md) — 工作空间的定义 - [`[workspace]`](https://course.rs/cargo/reference/workspaces.html) — 工作空间的定义
下面,我们将对其中一些部分进行详细讲解。 下面,我们将对其中一些部分进行详细讲解。
@ -80,7 +80,7 @@ authors = ["Alice <a@example.com>", "Bob <b@example.com>"]
#### version #### version
Cargo 使用了[语义化版本控制](https://semver.org)的概念,例如字符串 `"0.1.12"` 是一个 `semver` 格式的版本号,符合 `"x.y.z"` 的形式,其中 `x` 被称为主版本(major), `y` 被称为小版本 `minor` ,而 `z` 被称为 补丁 `patch`,可以看出从左到右,版本的影响范围逐步降低,补丁的更新是无关痛痒的,并不会造成 API 的兼容性被破坏。 Cargo 使用了[语义化版本控制](https://semver.org)的概念,例如字符串 `"0.1.12"` 是一个 `semver` 格式的版本号,符合 `"x.y.z"` 的形式,其中 `x` 被称为主版本`major`, `y` 被称为小版本 `minor` ,而 `z` 被称为补丁 `patch`,可以看出从左到右,版本的影响范围逐步降低,补丁的更新是无关痛痒的,并不会造成 API 的兼容性被破坏。
使用该规则,你还需要遵循一些基本规则: 使用该规则,你还需要遵循一些基本规则:
@ -160,7 +160,7 @@ documentation = "https://docs.rs/bitflags"
#### readme #### readme
`readme` 字段指向项目的 `Readme.md` 文件,该文件应该存在项目的根目录下(跟 `Cargo.toml` 同级),用于向用户描述项目的详细信息,支持 `Markdown` 格式。大家看到的 `crates.io` 上的项目首页就是基于该文件的内容进行渲染的。 `readme` 字段指向项目的 `README.md` 文件,该文件应该存在项目的根目录下(跟 `Cargo.toml` 同级),用于向用户描述项目的详细信息,支持 `Markdown` 格式。大家看到的 `crates.io` 上的项目首页就是基于该文件的内容进行渲染的。
```toml ```toml
[package] [package]
@ -261,11 +261,11 @@ workspace = "path/to/workspace/root"
- 该包是工作空间的根包(root crate),通过 `[workspace]` 指定) - 该包是工作空间的根包(root crate),通过 `[workspace]` 指定)
- 该包是另一个工作空间的成员,通过 `package.workspace` 指定 - 该包是另一个工作空间的成员,通过 `package.workspace` 指定
若要了解工作空间的更多信息,请参见[这里](https://course.rs/toolchains/cargo/reference/workspaces.html)。 若要了解工作空间的更多信息,请参见[这里](https://course.rs/cargo/reference/workspaces.html)。
#### build #### build
`build` 用于指定位于项目根目录中的构建脚本,关于构建脚本的更多信息,可以阅读 [构建脚本](https://course.rs/toolchains/cargo/reference/build-script/intro.html) 一章。 `build` 用于指定位于项目根目录中的构建脚本,关于构建脚本的更多信息,可以阅读 [构建脚本](https://course.rs/cargo/reference/build-script/intro.html) 一章。
```toml ```toml
[package] [package]
@ -277,7 +277,7 @@ build = "build.rs"
#### links #### links
用于指定项目链接的本地库的名称,更多的信息请看构建脚本章节的 [links](https://course.rs/toolchains/cargo/reference/build-script/intro.html#links) 用于指定项目链接的本地库的名称,更多的信息请看构建脚本章节的 [links](https://course.rs/cargo/reference/build-script/intro.html#links)
```toml ```toml
[package] [package]
@ -390,9 +390,9 @@ maintenance = { status = "..." }
## [dependencies] ## [dependencies]
在[之前章节](http://course.rs/toolchains/cargo/reference/specify-deps.html)中,我们已经详细介绍过 `[dependencies]``[dev-dependencies]``[build-dependencies]`,这里就不再赘述。 在[之前章节](https://course.rs/cargo/reference/specify-deps.html)中,我们已经详细介绍过 `[dependencies]``[dev-dependencies]``[build-dependencies]`,这里就不再赘述。
## [profile.*] ## [profile.*]
该部分可以对编译器进行配置,例如 debug 和优化,在后续的[编译器优化](http://course.rs/toolchains/cargo/reference/profiles.html)章节有详细介绍。 该部分可以对编译器进行配置,例如 debug 和优化,在后续的[编译器优化](https://course.rs/cargo/reference/profiles.html)章节有详细介绍。

@ -49,7 +49,7 @@ lto = true
cargo build --profile release-lto cargo build --profile release-lto
``` ```
与默认的 profile 相同,自定义 profile 的编译结果也存放在 [`target/`](https://course.rs/toolchains/cargo/guide/build-cache.html) 下的同名目录中,例如 `--profile release-lto` 的输出结果存储在 `target/release-lto` 中。 与默认的 profile 相同,自定义 profile 的编译结果也存放在 [`target/`](https://course.rs/cargo/guide/build-cache.html) 下的同名目录中,例如 `--profile release-lto` 的输出结果存储在 `target/release-lto` 中。
## 选择 profile ## 选择 profile
@ -257,7 +257,7 @@ codegen-units = 256
opt-level = 3 opt-level = 3
``` ```
这里的 `package` 名称实际上是一个 [`Package ID`](https://course.rs/toolchains/cargo/reference/package-id.html),因此我们还可以通过版本号来选择: `[profile.dev.package."foo:2.1.0"]` 这里的 `package` 名称实际上是一个 [`Package ID`](https://course.rs/cargo/reference/package-id.html),因此我们还可以通过版本号来选择: `[profile.dev.package."foo:2.1.0"]`
如果要为所有依赖包重写(不包括工作空间的成员): 如果要为所有依赖包重写(不包括工作空间的成员):

@ -22,14 +22,14 @@ $ cargo login abcdefghijklmnopqrstuvwxyz012345
在发布之前,**确保** `Cargo.toml` 中以下字段已经被设置: 在发布之前,**确保** `Cargo.toml` 中以下字段已经被设置:
- [license 或 license-file](https://course.rs/toolchains/cargo/reference/manifest.html#license和license-file) - [license 或 license-file](https://course.rs/cargo/reference/manifest.html#license和license-file)
- [description](https://course.rs/toolchains/cargo/reference/manifest.html#description) - [description](https://course.rs/cargo/reference/manifest.html#description)
- [homepage](https://course.rs/toolchains/cargo/reference/manifest.html#homepage) - [homepage](https://course.rs/cargo/reference/manifest.html#homepage)
- [documentation](https://course.rs/toolchains/cargo/reference/manifest.html#documentation) - [documentation](https://course.rs/cargo/reference/manifest.html#documentation)
- [repository](https://course.rs/toolchains/cargo/reference/manifest.html#repository) - [repository](https://course.rs/cargo/reference/manifest.html#repository)
- [readme](https://course.rs/toolchains/cargo/reference/manifest.html#readme) - [readme](https://course.rs/cargo/reference/manifest.html#readme)
你还可以设置[关键字](https://course.rs/toolchains/cargo/reference/manifest.html#keywords)和[类别](https://course.rs/toolchains/cargo/reference/manifest.html#categories)等元信息,让包更容易被其他人搜索发现,虽然它们不是必须的。 你还可以设置[关键字](https://course.rs/cargo/reference/manifest.html#keywords)和[类别](https://course.rs/cargo/reference/manifest.html#categories)等元信息,让包更容易被其他人搜索发现,虽然它们不是必须的。
如果你发布的是一个依赖库,那么你可能需要遵循相关的[命名规范](https://course.rs/practice/naming.html)和 [API Guidlines](https://rust-lang.github.io/api-guidelines/). 如果你发布的是一个依赖库,那么你可能需要遵循相关的[命名规范](https://course.rs/practice/naming.html)和 [API Guidlines](https://rust-lang.github.io/api-guidelines/).
@ -55,7 +55,7 @@ $ cargo publish --dry-run
$cargo package --list $cargo package --list
``` ```
当打包时Cargo 会自动根据版本控制系统的配置来忽略指定的文件,例如 `.gitignore`。除此之外,你还可以通过 [`exclude`](https://course.rs/toolchains/cargo/reference/manifest.html#exclude和include) 来排除指定的文件: 当打包时Cargo 会自动根据版本控制系统的配置来忽略指定的文件,例如 `.gitignore`。除此之外,你还可以通过 [`exclude`](https://course.rs/cargo/reference/manifest.html#exclude和include) 来排除指定的文件:
```toml ```toml
[package] [package]
@ -91,7 +91,7 @@ $ cargo pulish
绝大多数时候,我们并不是在发布新包,而是发布已经上传过的包的新版本。 绝大多数时候,我们并不是在发布新包,而是发布已经上传过的包的新版本。
为了实现这一点,只需修改 `Cargo.toml` 中的 [`version`](https://course.rs/toolchains/cargo/reference/manifest.html#version) 字段 ,但需要注意:**版本号需要遵循 `semver` 规则**。 为了实现这一点,只需修改 `Cargo.toml` 中的 [`version`](https://course.rs/cargo/reference/manifest.html#version) 字段 ,但需要注意:**版本号需要遵循 `semver` 规则**。
然后再次使用 `cargo publish` 就可以上传新的版本了。 然后再次使用 `cargo publish` 就可以上传新的版本了。

@ -15,7 +15,7 @@
time = "0.1.12" time = "0.1.12"
``` ```
字符串 `"0.1.12"` 是一个 [`semver`](https://semver.org) 格式的版本号,符合 `"x.y.z"` 的形式,其中 `x` 被称为主版本(major), `y` 被称为小版本 `minor` ,而 `z` 被称为 补丁 `patch`,可以看出从左到右,版本的影响范围逐步降低,补丁的更新是无关痛痒的,并不会造成 API 的兼容性被破坏。 字符串 `"0.1.12"` 是一个 [`semver`](https://semver.org) 格式的版本号,符合 `"x.y.z"` 的形式,其中 `x` 被称为主版本`major`, `y` 被称为小版本 `minor` ,而 `z` 被称为补丁 `patch`,可以看出从左到右,版本的影响范围逐步降低,补丁的更新是无关痛痒的,并不会造成 API 的兼容性被破坏。
`"0.1.12"` 中并没有任何额外的符号,在版本语义上,它跟使用了 `^``"^0.1.12"` 是相同的,都是指定非常具体的版本进行引入。 `"0.1.12"` 中并没有任何额外的符号,在版本语义上,它跟使用了 `^``"^0.1.12"` 是相同的,都是指定非常具体的版本进行引入。
@ -145,7 +145,7 @@ regex = { git = "https://github.com/rust-lang/regex", branch = "next" }
**因此不要依赖锁定来完成版本的控制,而应该老老实实的在 `Cargo.toml` 小心配置你希望使用的版本。** **因此不要依赖锁定来完成版本的控制,而应该老老实实的在 `Cargo.toml` 小心配置你希望使用的版本。**
如果访问的是私有仓库,你可能需要授权来访问该仓库,可以查看[这里](https://course.rs/toolchains/cargo/git-auth.html)了解授权的方式。 如果访问的是私有仓库,你可能需要授权来访问该仓库,可以查看[这里](https://course.rs/cargo/git-auth.html)了解授权的方式。
#### 通过路径引入本地依赖包 #### 通过路径引入本地依赖包
@ -223,7 +223,7 @@ openssl = "1.0.1"
如果你想要知道 `cfg` 能够作用的目标,可以在终端中运行 `rustc --print=cfg` 进行查询。当然,你可以指定平台查询: `rustc --print=cfg --target=x86_64-pc-windows-msvc`,该命令将对 `64bit` 的 Windows 进行查询。 如果你想要知道 `cfg` 能够作用的目标,可以在终端中运行 `rustc --print=cfg` 进行查询。当然,你可以指定平台查询: `rustc --print=cfg --target=x86_64-pc-windows-msvc`,该命令将对 `64bit` 的 Windows 进行查询。
聪明的同学已经发现,这非常类似于条件依赖引入,那我们是不是可以根据自定义的条件来决定是否引入某个依赖呢?具体答案参见后续的 [feature](https://course.rs/toolchains/cargo/reference/features.html) 章节。这里是一个简单的示例: 聪明的同学已经发现,这非常类似于条件依赖引入,那我们是不是可以根据自定义的条件来决定是否引入某个依赖呢?具体答案参见后续的 [feature](https://course.rs/cargo/reference/features.html) 章节。这里是一个简单的示例:
```toml ```toml
[dependencies] [dependencies]
@ -310,7 +310,7 @@ default-features = false # 不要包含默认的 features而是通过下面
features = ["secure-password", "civet"] features = ["secure-password", "civet"]
``` ```
更多的信息参见 [Features 章节](https://course.rs/toolchains/cargo/reference/features.html) 更多的信息参见 [Features 章节](https://course.rs/cargo/reference/features.html)
## 在 Cargo.toml 中重命名依赖 ## 在 Cargo.toml 中重命名依赖

@ -54,7 +54,7 @@ exclude = ["crates/proc_macro_test/imp"]
工作空间的几个关键点在于: 工作空间的几个关键点在于:
- 所有的 `package` 共享同一个 `Cargo.lock` 文件,该文件位于工作空间的根目录中 - 所有的 `package` 共享同一个 `Cargo.lock` 文件,该文件位于工作空间的根目录中
- 所有的 `package` 共享同一个[输出目录](https://course.rs/toolchains/cargo/guide/build-cache.html),该目录默认的名称是 `target` ,位于工作空间根目录下 - 所有的 `package` 共享同一个[输出目录](https://course.rs/cargo/guide/build-cache.html),该目录默认的名称是 `target` ,位于工作空间根目录下
- 只有工作空间根目录的 `Cargo.toml` 才能包含 `[patch]`, `[replace]``[profile.*]`,而成员的 `Cargo.toml` 中的相应部分将被自动忽略 - 只有工作空间根目录的 `Cargo.toml` 才能包含 `[patch]`, `[replace]``[profile.*]`,而成员的 `Cargo.toml` 中的相应部分将被自动忽略
## [workspace] ## [workspace]
@ -67,7 +67,7 @@ members = ["member1", "path/to/member2", "crates/*"]
exclude = ["crates/foo", "path/to/other"] exclude = ["crates/foo", "path/to/other"]
``` ```
若某个本地依赖包是通过 [`path`](https://course.rs/toolchains/cargo/reference/specify-deps.html#通过路径引入本地依赖包) 引入,且该包位于工作空间的目录中,则该包自动成为工作空间的成员。 若某个本地依赖包是通过 [`path`](https://course.rs/cargo/reference/specify-deps.html#通过路径引入本地依赖包) 引入,且该包位于工作空间的目录中,则该包自动成为工作空间的成员。
剩余的成员需要通过 `workspace.members` 来指定,里面包含了各个成员所在的目录(成员目录中包含了 Cargo.toml )。 剩余的成员需要通过 `workspace.members` 来指定,里面包含了各个成员所在的目录(成员目录中包含了 Cargo.toml )。
@ -116,7 +116,7 @@ default-members = ["path/to/member2", "path/to/member3/foo"]
## workspace.metadata ## workspace.metadata
与 [package.metadata](https://course.rs/toolchains/cargo/reference/manifest.html#metadata) 非常类似,`workspace.metadata` 会被 `Cargo` 自动忽略,就算没有被使用也不会发出警告。 与 [package.metadata](https://course.rs/cargo/reference/manifest.html#metadata) 非常类似,`workspace.metadata` 会被 `Cargo` 自动忽略,就算没有被使用也不会发出警告。
这个部分可以用于让工具在 `Cargo.toml` 中存储一些工作空间的配置元信息。例如: 这个部分可以用于让工具在 `Cargo.toml` 中存储一些工作空间的配置元信息。例如:

@ -161,11 +161,11 @@ color = { git = "https://github.com/bjz/color-rs" }
geometry = { path = "crates/geometry" } geometry = { path = "crates/geometry" }
``` ```
相信聪明的读者已经能看懂该如何引入外部依赖库,这里就不再赘述。详细的说明参见此章:[Cargo 依赖管理](https://course.rs/toolchains/cargo/reference/specify-deps.html),但是不建议大家现在去看,只要按照目录浏览,拨云见雾指日可待。 相信聪明的读者已经能看懂该如何引入外部依赖库,这里就不再赘述。详细的说明参见此章:[Cargo 依赖管理](https://course.rs/cargo/reference/specify-deps.html),但是不建议大家现在去看,只要按照目录浏览,拨云见雾指日可待。
## 基于 cargo 的项目组织结构 ## 基于 cargo 的项目组织结构
前文有提到 `cargo` 默认生成的项目结构,真实的项目肯定会有所不同,但是在目前的学习阶段,还无需关注。感兴趣的同学可以移步:[Cargo 项目结构](https://course.rs/toolchains/cargo/guide/package-layout.html) 前文有提到 `cargo` 默认生成的项目结构,真实的项目肯定会有所不同,但是在目前的学习阶段,还无需关注。感兴趣的同学可以移步:[Cargo 项目结构](https://course.rs/cargo/guide/package-layout.html)
至此,大家对 Rust 项目的创建和管理已经有了初步的了解,那么来完善刚才的`"世界,你好"`项目吧。 至此,大家对 Rust 项目的创建和管理已经有了初步的了解,那么来完善刚才的`"世界,你好"`项目吧。

@ -19,24 +19,26 @@
## Sym ## Sym
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| ----------------------- | ------------ | ------------------------------------------------ | | ----------------------- | -------------- | ------------------------------------------------ |
| [?] | 错误传播 | 用于简化错误传播 | | [?] | 错误传播 | 用于简化错误传播 |
| [()] | 单元类型 | 单元类型,无返回值 | | [()] | 单元类型 | 单元类型,无返回值 |
| `!` : [1 函数] [2 类型] | 永不返回 | 永不返回 | | `!` : [1 函数] [2 类型] | 永不返回 | 永不返回 |
| [&] | 引用 | 常规引用是一个指针类型,指向了对象存储的内存地址 | | [&] | 引用 | 常规引用是一个指针类型,指向了对象存储的内存地址 |
| [\*] | 解引用 | 解出引用所指向的值 | | [\*] | 解引用 | 解出引用所指向的值 |
| [@] | 变量绑定 | 为一个字段绑定另外一个变量 | | [@] | 变量绑定 | 为一个字段绑定另外一个变量 |
| ['a: 'b] | 生命周期约束 | | | ['a: 'b] | 生命周期约束 | 用来说明两个生命周期的长短 |
| [{:?}] {:#?} | 打印结构体信息 | 使用 `#[derive(Debug)]` 派生实现 `Debug` 特征 |
| A | | AIntroduction | | A | | AIntroduction |
[?]: https://course.rs/basic/result-error/result.html#传播界的大明星- [?]: https://course.rs/basic/result-error/result.html#传播界的大明星-
[()]: https://course.rs/basic/base-type/function.html#无返回值 [()]: https://course.rs/basic/base-type/function.html#无返回值
[1 函数]: https://course.rs/basic/base-type/function.html#永不返回的函数 [1 函数]: https://course.rs/basic/base-type/function.html#永不返回的发散函数-
[2 类型]: https://course.rs/advance/into-types/custom-type.html#永不返回类型 [2 类型]: https://course.rs/advance/into-types/custom-type.html#永不返回类型
[&]: https://course.rs/basic/ownership/borrowing.html#引用与解引用 [&]: https://course.rs/basic/ownership/borrowing.html#引用与解引用
[\*]: https://course.rs/basic/ownership/borrowing.html#引用与解引用 [\*]: https://course.rs/basic/ownership/borrowing.html#引用与解引用
[@]: https://course.rs/basic/match-pattern/all-patterns.html#绑定 [@]: https://course.rs/basic/match-pattern/all-patterns.html#绑定
['a: 'b]: https://course.rs/advance/lifetime/advance.html#生命周期约束-hrtb ['a: 'b]: https://course.rs/advance/lifetime/advance.html#生命周期约束-hrtb
[{:?}]: https://course.rs/basic/compound-type/struct.html?search=#使用-derivedebug-来打印结构体的信息
[back](#head) [back](#head)
@ -71,7 +73,7 @@
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| ------------ | -------- | ----------------------------------------------------------------------------------- | | ------------ | -------- | ----------------------------------------------------------------------------------- |
| [char 字符] | 字符类型 | 使用 `''` 表示,所有的 Unicode 值 | | [char 字符] | 字符类型 | 使用 `''` 表示,所有的 Unicode 值 |
| [const 常量] | constant | const MAX_POINTS: u32 = 100_000; | | [const 常量] | constant | `const MAX_POINTS: u32 = 100_000;` |
| [Copy 拷贝] | 浅拷贝 | 任何基本类型的组合可以 `Copy`,不需要分配内存或某种形式资源的类型是可以 `Copy` 的。 | | [Copy 拷贝] | 浅拷贝 | 任何基本类型的组合可以 `Copy`,不需要分配内存或某种形式资源的类型是可以 `Copy` 的。 |
| [Clone 克隆] | 深拷贝 | 需要复制堆上的数据时,可以使用 `.clone()` 方法 | | [Clone 克隆] | 深拷贝 | 需要复制堆上的数据时,可以使用 `.clone()` 方法 |
| C | KWC | CIntroduction | | C | KWC | CIntroduction |
@ -94,15 +96,18 @@
## E ## E
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| ---- | ------ | ------------- | | ----------- | -------- | ---------------------------------------- |
| [enum 枚举] | 枚举类型 | 允许通过列举可能的成员来定义一个枚举类型 |
| E | KWE | EIntroduction | | E | KWE | EIntroduction |
[enum 枚举]: https://course.rs/basic/compound-type/enum.html#枚举
[back](#head) [back](#head)
## F ## F
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| -------- | -------- | -------------------------- | | -------- | -------- | ------------------------ |
| [浮点数] | 数值类型 | `f32`<br>`f64`(默认类型) | | [浮点数] | 数值类型 | `f32`<br>`f64`(默认类型) |
| F | KWF | FIntroduction | | F | KWF | FIntroduction |
@ -156,9 +161,9 @@
## L ## L
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| --------- | -------- | --------------------------- | | --------- | -------- | ----------------------------- |
| [let] | 变量绑定 | let x : u32 = 5; | | [let] | 变量绑定 | `let x : u32 = 5;` |
| [let mut] | 可变变量 | let mut x : u32 = 5; x = 9; | | [let mut] | 可变变量 | `let mut x : u32 = 5; x = 9;` |
| L | KWL | LIntroduction | | L | KWL | LIntroduction |
[let]: https://course.rs/basic/variable.html#变量绑定 [let]: https://course.rs/basic/variable.html#变量绑定
@ -188,9 +193,12 @@
## O ## O
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| ---- | ------ | ------------- | | -------- | ----------- | ------------- |
| [Option] | Option 枚举 | 用于处理空值 |
| O | KWO | OIntroduction | | O | KWO | OIntroduction |
[option]: https://course.rs/basic/compound-type/enum.html#option-枚举用于处理空值
[back](#head) [back](#head)
## P ## P
@ -229,6 +237,7 @@
| [slice 切片] | `&str` | 允许你引用 `String` 中部分连续的元素序列,而不是引用整个 `String` <br>语法:`[开始索引..终止索引]`<br>字符串字面量是切片 | | [slice 切片] | `&str` | 允许你引用 `String` 中部分连续的元素序列,而不是引用整个 `String` <br>语法:`[开始索引..终止索引]`<br>字符串字面量是切片 |
| [String 字符串] | `String` 类型 | Rust 中的字符串是 UTF-8 编码,也就是字符串中的字符所占的字节数是变化的(1 - 4) | | [String 字符串] | `String` 类型 | Rust 中的字符串是 UTF-8 编码,也就是字符串中的字符所占的字节数是变化的(1 - 4) |
| [String 操作] | `String` 方法 | 由于 `String` 是可变字符串,因此我们可以对它进行创建、增删操作 | | [String 操作] | `String` 方法 | 由于 `String` 是可变字符串,因此我们可以对它进行创建、增删操作 |
| [struct 结构体] | 结构体 | 通过关键字 `struct` 定义<br>一个清晰明确的结构体 `名称`<br>几个有名字的结构体 `字段`<br>通过 `.` 访问字段 |
| S | KWS | SIntroduction | | S | KWS | SIntroduction |
[所有权与堆栈]: https://course.rs/basic/ownership/ownership.html#所有权与堆栈 [所有权与堆栈]: https://course.rs/basic/ownership/ownership.html#所有权与堆栈
@ -236,26 +245,32 @@
[slice 切片]: https://course.rs/basic/compound-type/string-slice.html#切片slice [slice 切片]: https://course.rs/basic/compound-type/string-slice.html#切片slice
[string 字符串]: https://course.rs/basic/compound-type/string-slice.html#什么是字符串 [string 字符串]: https://course.rs/basic/compound-type/string-slice.html#什么是字符串
[string 操作]: https://course.rs/basic/compound-type/string-slice.html#操作字符串 [string 操作]: https://course.rs/basic/compound-type/string-slice.html#操作字符串
[struct 结构体]: https://course.rs/basic/compound-type/struct.html
[back](#head) [back](#head)
## T ## T
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| ------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | -------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Tuple 元组] | | 由多种类型组合一起,元组的长度是固定的,元组中元素的顺序也是固定的<br>用模式匹配解构元组:`let (x, y, z) = (20, 19.2, 1)`<br>`.` 来访问元组:`tuple.0` 索引从 0 开始 | | [Tuple 元组] | | 由多种类型组合一起,元组的长度是固定的,元组中元素的顺序也是固定的<br>用模式匹配解构元组:`let (x, y, z) = (20, 19.2, 1)`<br>`.` 来访问元组:`tuple.0` 索引从 0 开始 |
| [Tuple Struct] | 元组结构体 | 结构体必须要有名称,但字段可以没有名称<br>`struct Color(i32, i32, i32);` |
| T | KWT | TIntroduction | | T | KWT | TIntroduction |
[tuple 元组]: https://course.rs/basic/compound-type/tuple.html#元组 [tuple 元组]: https://course.rs/basic/compound-type/tuple.html#元组
[tuple struct]: https://course.rs/basic/compound-type/struct.html?search=#元组结构体tuple-struct
[back](#head) [back](#head)
## U ## U
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| ---- | ------ | ------------- | | ------------------ | ---------- | ------------------------------------------- |
| [Unit-like Struct] | 单元结构体 | 没有任何字段和属性<br>`struct AlwaysEqual;` |
| U | KWU | UIntroduction | | U | KWU | UIntroduction |
[unit-like struct]: https://course.rs/basic/compound-type/struct.html?search=#单元结构体unit-like-struct
[back](#head) [back](#head)
## V ## V

@ -37,7 +37,7 @@ mod tests {
`#[cfg(test)]` 中,`cfg` 是配置 `configuration` 的缩写,它告诉 Rust :当 `test` 配置项存在时,才运行下面的代码,而 `cargo test` 在运行时,就会将 `test` 这个配置项传入进来,因此后面的 `tests` 模块会被包含进来。 `#[cfg(test)]` 中,`cfg` 是配置 `configuration` 的缩写,它告诉 Rust :当 `test` 配置项存在时,才运行下面的代码,而 `cargo test` 在运行时,就会将 `test` 这个配置项传入进来,因此后面的 `tests` 模块会被包含进来。
大家看出来了吗?这是典型的条件编译,`Cargo` 会根据指定的配置来选择是否编译指定的代码,事实上关于条件编译 Rust 能做的不仅仅是这些,在 [`Cargo` 专题](https://course.rs/toolchains/cargo/intro.html)中我们会进行更为详细的介绍。 大家看出来了吗?这是典型的条件编译,`Cargo` 会根据指定的配置来选择是否编译指定的代码,事实上关于条件编译 Rust 能做的不仅仅是这些,在 [`Cargo` 专题](https://course.rs/cargo/intro.html)中我们会进行更为详细的介绍。
#### 测试私有函数 #### 测试私有函数

@ -101,15 +101,15 @@
## 2022-03-03 ## 2022-03-03
- 新增章节: [Cargo - 构建脚本示例](https://course.rs/toolchains/cargo/reference/build-script/examples.html) - 新增章节: [Cargo - 构建脚本示例](https://course.rs/cargo/reference/build-script/examples.html)
## 2022-03-02 ## 2022-03-02
- 新增章节: [Cargo - 构建脚本](https://course.rs/toolchains/cargo/reference/build-script/intro.html) - 新增章节: [Cargo - 构建脚本](https://course.rs/cargo/reference/build-script/intro.html)
## 2022-02-28 ## 2022-02-28
- 新增章节: [Cargo - 发布到crates.io](https://course.rs/toolchains/cargo/reference/publishing-on-crates.io.html) - 新增章节: [Cargo - 发布到crates.io](https://course.rs/cargo/reference/publishing-on-crates.io.html)
- 新增内容:[结构体 - #[derive(Debug)]](https://course.rs/basic/compound-type/struct.html#使用-derivedebug-来打印结构体的信息) - 新增内容:[结构体 - #[derive(Debug)]](https://course.rs/basic/compound-type/struct.html#使用-derivedebug-来打印结构体的信息)
## 2022-02-27 ## 2022-02-27

Loading…
Cancel
Save