From b8783ad2015d58b46fca80a26756356a63f3e92e Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Thu, 17 Mar 2022 13:12:54 +0800 Subject: [PATCH 1/2] Fix typo in concurrency-with-threads/sync2.md & send-sync.md --- src/advance/concurrency-with-threads/send-sync.md | 12 ++++++------ src/advance/concurrency-with-threads/sync2.md | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/advance/concurrency-with-threads/send-sync.md b/src/advance/concurrency-with-threads/send-sync.md index 44dcdb27..0301b2b3 100644 --- a/src/advance/concurrency-with-threads/send-sync.md +++ b/src/advance/concurrency-with-threads/send-sync.md @@ -27,7 +27,7 @@ error[E0277]: `Rc` cannot be sent between threads safely = help: within `[closure@src/main.rs:5:27: 7:6]`, the trait `Send` is not implemented for `Rc` ``` -表面原因是`Rc`无法在线程间安全的转移,实际是编译器给予我们的那句帮助: `the trait Send is not implemented for Rc`(`Rc`未实现`Send`特征), 那么此处的`Send`特征又是何方神圣? +表面原因是`Rc`无法在线程间安全的转移,实际是编译器给予我们的那句帮助: ```the trait `Send` is not implemented for `Rc` ```(`Rc`未实现`Send`特征), 那么此处的`Send`特征又是何方神圣? ## Rc 和 Arc 源码对比 @@ -50,7 +50,7 @@ unsafe impl Sync for Arc {} `Send`和`Sync`是 Rust 安全并发的重中之重,但是实际上它们只是标记特征(marker trait,该特征未定义任何行为,因此非常适合用于标记), 来看看它们的作用: - 实现`Send`的类型可以在线程间安全的传递其所有权 -- 实现了`Sync`的类型可以在线程间安全的共享(通过引用) +- 实现`Sync`的类型可以在线程间安全的共享(通过引用) 这里还有一个潜在的依赖:一个类型要在线程间安全的共享的前提是,指向它的引用必须能在线程间传递。因为如果引用都不能被传递,我们就无法在多个线程间使用引用去访问同一个数据了。 @@ -62,7 +62,7 @@ unsafe impl Sync for Arc {} unsafe impl Sync for RwLock {} ``` -首先`RwLock`可以在线程间安全的共享,那它肯定是实现了`Sync`,但是我们的关注点不在这里。众多周知,`RwLock`可以并发的读,说明其中的值`T`必定也可以在线程间共享,那`T`必定要实现`Sync`。 +首先`RwLock`可以在线程间安全的共享,那它肯定是实现了`Sync`,但是我们的关注点不在这里。众所周知,`RwLock`可以并发的读,说明其中的值`T`必定也可以在线程间共享,那`T`必定要实现`Sync`。 果不其然,上述代码中,`T`的特征约束中就有一个`Sync`特征,那问题又来了,`Mutex`是不是相反?再来看看: @@ -84,7 +84,7 @@ unsafe impl Sync for Mutex {} - `UnsafeCell`不是`Sync`,因此`Cell`和`RefCell`也不是 - `Rc`两者都没实现(因为内部的引用计数器不是线程安全的) -当然,如果是自定义的复合类型,那没实现那哥俩的就较为常见了:**只要复合类型中有一个成员不是`Send`或`Sync`,那么该符合类型也就不是`Send`或`Sync`**。 +当然,如果是自定义的复合类型,那没实现那哥俩的就较为常见了:**只要复合类型中有一个成员不是`Send`或`Sync`,那么该复合类型也就不是`Send`或`Sync`**。 **手动实现 `Send` 和 `Sync` 是不安全的**,通常并不需要手动实现 Send 和 Sync trait,实现者需要使用`unsafe`小心维护并发安全保证。 @@ -106,7 +106,7 @@ fn main() { } ``` -报错跟之前无二: `*mut u8 cannot be sent between threads safely`, 但是有一个问题,我们无法为其直接实现`Send`特征,好在可以用[`newtype`类型](../custom-type.md#newtype) :`struct MyBox(*mut u8);`。 +报错跟之前无二: ``` `*mut u8` cannot be sent between threads safely```, 但是有一个问题,我们无法为其直接实现`Send`特征,好在可以用[`newtype`类型](../into-types/custom-type.md#newtype) :`struct MyBox(*mut u8);`。 还记得之前的规则吗:复合类型中有一个成员没实现`Send`,该复合类型就不是`Send`,因此我们需要手动为它实现: @@ -191,6 +191,6 @@ unsafe impl Sync for MyBox {} 通过上面的两个原生指针的例子,我们了解了如何实现`Send`和`Sync`,以及如何只实现`Send`而不实现`Sync`,简单总结下: 1. 实现`Send`的类型可以在线程间安全的传递其所有权, 实现`Sync`的类型可以在线程间安全的共享(通过引用) -2. 绝大部分类型都实现了`Send`和`Sync`,常见的未实现的有:原生指针、Cell/RefCell、Rc 等 +2. 绝大部分类型都实现了`Send`和`Sync`,常见的未实现的有:原生指针、`Cell`、`RefCell`、`Rc` 等 3. 可以为自定义类型实现`Send`和`Sync`,但是需要`unsafe`代码块 4. 可以为部分 Rust 中的类型实现`Send`、`Sync`,但是需要使用`newtype`,例如文中的原生指针例子 diff --git a/src/advance/concurrency-with-threads/sync2.md b/src/advance/concurrency-with-threads/sync2.md index 0b9af5fc..92fdb126 100644 --- a/src/advance/concurrency-with-threads/sync2.md +++ b/src/advance/concurrency-with-threads/sync2.md @@ -166,7 +166,7 @@ Y = 3; Y *= 2; X = 2; } ``` -还是可能出现`Y=2`,因为`Main`线程中的`X`和`Y`被同步到其它 CPU 缓存中的顺序未必一致。 +还是可能出现`Y = 2`,因为`Main`线程中的`X`和`Y`被同步到其它 CPU 缓存中的顺序未必一致。 #### 限定内存顺序的 5 个规则 From 2fad4d07f8a056685d3b827a0b4cb06ef7fac785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=83=E6=A9=98=20=E9=9B=AB=E9=9C=9E?= Date: Thu, 17 Mar 2022 14:00:52 +0800 Subject: [PATCH 2/2] Replace the broken link of `cargo` with `toolchains/cargo` Fix broken link of `course.rs/cargo` DAMAGED-CHANGE: e4b116b173e59e69124f8d8a2caed9cebc6babc3 --- assets/sitemap.xml | 24 +++++++++---------- src/advance/macro.md | 2 +- src/async-rust/tokio/getting-startted.md | 2 +- src/first-try/cargo.md | 4 ++-- src/test/unit-integration-test.md | 2 +- src/toolchains/cargo/guide/build-cache.md | 18 +++++++------- src/toolchains/cargo/guide/cargo-cache.md | 4 ++-- src/toolchains/cargo/guide/dependencies.md | 2 +- src/toolchains/cargo/guide/package-layout.md | 2 +- .../cargo/reference/build-script/examples.md | 4 ++-- .../cargo/reference/build-script/intro.md | 6 ++--- .../cargo/reference/cargo-target.md | 6 ++--- .../cargo/reference/configuration.md | 6 ++--- .../cargo/reference/deps-overriding.md | 8 +++---- .../cargo/reference/features/intro.md | 6 ++--- src/toolchains/cargo/reference/manifest.md | 10 ++++---- src/toolchains/cargo/reference/profiles.md | 4 ++-- .../reference/publishing-on-crates.io.md | 18 +++++++------- .../cargo/reference/specify-deps.md | 6 ++--- src/toolchains/cargo/reference/workspaces.md | 6 ++--- 内容变更记录.md | 6 ++--- 21 files changed, 73 insertions(+), 73 deletions(-) diff --git a/assets/sitemap.xml b/assets/sitemap.xml index 6bb6863c..bb88977c 100644 --- a/assets/sitemap.xml +++ b/assets/sitemap.xml @@ -426,62 +426,62 @@ weekly - + 2021-12-30 weekly - + 2021-12-30 weekly - + 2021-12-30 weekly - + 2021-12-30 weekly - + 2021-12-30 weekly - + 2021-12-30 weekly - + 2021-12-30 weekly - + 2021-12-30 weekly - + 2021-12-30 weekly - + 2021-12-30 weekly - + 2021-12-30 weekly - + 2021-12-30 weekly diff --git a/src/advance/macro.md b/src/advance/macro.md index 1843a754..230978da 100644 --- a/src/advance/macro.md +++ b/src/advance/macro.md @@ -320,7 +320,7 @@ hello_macro_derive = { path = "../hello_macro/hello_macro_derive" } # hello_macro_derive = { path = "./hello_macro_derive" } ``` -此时,`hello_macro` 项目就可以成功的引用到 `hello_macro_derive` 本地包了,对于项目依赖引入的详细介绍,可以参见 [Cargo 章节](https://course.rs/cargo/dependency.html)。 +此时,`hello_macro` 项目就可以成功的引用到 `hello_macro_derive` 本地包了,对于项目依赖引入的详细介绍,可以参见 [Cargo 章节](https://course.rs/toolchains/cargo/dependency.html)。 接下来,就到了重头戏环节,一起来看看该如何定义过程宏。 diff --git a/src/async-rust/tokio/getting-startted.md b/src/async-rust/tokio/getting-startted.md index d2459f01..f24cb882 100644 --- a/src/async-rust/tokio/getting-startted.md +++ b/src/async-rust/tokio/getting-startted.md @@ -209,7 +209,7 @@ fn main() { tokio = { version = "1", features = ["full"] } ``` -里面有个 `features = ["full"]` 可能大家会比较迷惑,当然,关于它的具体解释在本书的 [Cargo 详解专题](https://course.rs/cargo/intro.html) 有介绍,这里就简单进行说明, +里面有个 `features = ["full"]` 可能大家会比较迷惑,当然,关于它的具体解释在本书的 [Cargo 详解专题](https://course.rs/toolchains/cargo/intro.html) 有介绍,这里就简单进行说明, `Tokio` 有很多功能和特性,例如 `TCP`,`UDP`,`Unix sockets`,同步工具,多调度类型等等,不是每个应用都需要所有的这些特性。为了优化编译时间和最终生成可执行文件大小、内存占用大小,应用可以对这些特性进行可选引入。 diff --git a/src/first-try/cargo.md b/src/first-try/cargo.md index a008da22..1592a553 100644 --- a/src/first-try/cargo.md +++ b/src/first-try/cargo.md @@ -161,10 +161,10 @@ color = { git = "https://github.com/bjz/color-rs" } geometry = { path = "crates/geometry" } ``` -相信聪明的读者已经能看懂该如何引入外部依赖库,这里就不再赘述。详细的说明参见此章:[Cargo 依赖管理](https://course.rs/cargo/reference/specify-deps.html),但是不建议大家现在去看,只要按照目录浏览,拨云见雾指日可待。 +相信聪明的读者已经能看懂该如何引入外部依赖库,这里就不再赘述。详细的说明参见此章:[Cargo 依赖管理](https://course.rs/toolchains/cargo/reference/specify-deps.html),但是不建议大家现在去看,只要按照目录浏览,拨云见雾指日可待。 ## 基于 cargo 的项目组织结构 -前文有提到 `cargo` 默认生成的项目结构,真实的项目肯定会有所不同,但是在目前的学习阶段,还无需关注。感兴趣的同学可以移步:[Cargo 项目结构](https://course.rs/cargo/guide/package-layout.html ) +前文有提到 `cargo` 默认生成的项目结构,真实的项目肯定会有所不同,但是在目前的学习阶段,还无需关注。感兴趣的同学可以移步:[Cargo 项目结构](https://course.rs/toolchains/cargo/guide/package-layout.html) 至此,大家对 Rust 项目的创建和管理已经有了初步的了解,那么来完善刚才的`"世界,你好"`项目吧。 diff --git a/src/test/unit-integration-test.md b/src/test/unit-integration-test.md index 3d7e6636..a639d251 100644 --- a/src/test/unit-integration-test.md +++ b/src/test/unit-integration-test.md @@ -37,7 +37,7 @@ mod tests { 在 `#[cfg(test)]` 中,`cfg` 是配置 `configuration` 的缩写,它告诉 Rust :当 `test` 配置项存在时,才运行下面的代码,而 `cargo test` 在运行时,就会将 `test` 这个配置项传入进来,因此后面的 `tests` 模块会被包含进来。 -大家看出来了吗?这是典型的条件编译,`Cargo` 会根据指定的配置来选择是否编译指定的代码,事实上关于条件编译 Rust 能做的不仅仅是这些,在 [`Cargo` 专题](https://course.rs/cargo/intro.html)中我们会进行更为详细的介绍。 +大家看出来了吗?这是典型的条件编译,`Cargo` 会根据指定的配置来选择是否编译指定的代码,事实上关于条件编译 Rust 能做的不仅仅是这些,在 [`Cargo` 专题](https://course.rs/toolchains/cargo/intro.html)中我们会进行更为详细的介绍。 #### 测试私有函数 diff --git a/src/toolchains/cargo/guide/build-cache.md b/src/toolchains/cargo/guide/build-cache.md index 2eddbc83..7b5a4d63 100644 --- a/src/toolchains/cargo/guide/build-cache.md +++ b/src/toolchains/cargo/guide/build-cache.md @@ -1,6 +1,6 @@ # 构建( Build )缓存 -`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` 命令行参数。 +`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` 命令行参数。 ## target 目录结构 @@ -8,7 +8,7 @@ #### 不使用 --target -若 `--target` 标志没有指定,`Cargo` 会根据宿主机架构进行构建,构建结果会放入项目根目录下的 `target` 目录中,`target` 下每个子目录中包含了相应的 [`发布配置profile`](https://course.rs/cargo/reference/profiles.html) 的构建结果,例如 `release`、`debug` 是自带的`profile`,前者往往用于生产环境,因为会做大量的性能优化,而后者则用于开发环境,此时的编译效率和报错信息是最好的。 +若 `--target` 标志没有指定,`Cargo` 会根据宿主机架构进行构建,构建结果会放入项目根目录下的 `target` 目录中,`target` 下每个子目录中包含了相应的 [`发布配置profile`](https://course.rs/toolchains/cargo/reference/profiles.html) 的构建结果,例如 `release`、`debug` 是自带的`profile`,前者往往用于生产环境,因为会做大量的性能优化,而后者则用于开发环境,此时的编译效率和报错信息是最好的。 除此之外我们还可以定义自己想要的 `profile` ,例如用于测试环境的 `profile`: `test`,用于预发环境的 `profile` :`pre-prod` 等。 @@ -33,7 +33,7 @@ | `target//debug/` | `target/thumbv7em-none-eabihf/debug/` | | `target//release/` | `target/thumbv7em-none-eabihf/release/` | -> **注意:**,当没有使用 `--target` 时,`Cargo` 会与构建脚本和过程宏一起共享你的依赖包,对于每个 `rustc` 命令调用而言,[`RUSTFLAGS`](https://course.rs/cargo/reference/configuration.html#配置文件概览) 也将被共享。 +> **注意:**,当没有使用 `--target` 时,`Cargo` 会与构建脚本和过程宏一起共享你的依赖包,对于每个 `rustc` 命令调用而言,[`RUSTFLAGS`](https://course.rs/toolchains/cargo/reference/configuration.html#配置文件概览) 也将被共享。 > > 而使用 `--target` 后,构建脚本、过程宏会针对宿主机的 CPU 架构进行各自构建,且不会共享 `RUSTFLAGS`。 @@ -43,8 +43,8 @@ | 目录 | 描述 | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | -| `target/debug/` | 包含编译后的输出,例如二进制可执行文件、[库对象( library target )](https://course.rs/cargo/reference/cargo-target.html#库对象library) | -| `target/debug/examples/` | 包含[示例对象( example target )](https://course.rs/cargo/reference/cargo-target.html#示例对象examples) | +| `target/debug/` | 包含编译后的输出,例如二进制可执行文件、[库对象( library target )](https://course.rs/toolchains/cargo/reference/cargo-target.html#库对象library) | +| `target/debug/examples/` | 包含[示例对象( example target )](https://course.rs/toolchains/cargo/reference/cargo-target.html#示例对象examples) | 还有一些命令会在 `target` 下生成自己的独立目录: @@ -58,8 +58,8 @@ Cargo 还会创建几个用于构建过程的其它类型目录,它们的目 | 目录 | 描述 | | -------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | `target/debug/deps` | 依赖和其它输出成果 | -| `target/debug/incremental` | `rustc` [增量编译](https://course.rs/cargo/reference/profiles.html#incremental)的输出,该缓存可以用于提升后续的编译速度 | -| `target/debug/build/` | [构建脚本](https://course.rs/cargo/reference/build-script/intro.html)的输出 | +| `target/debug/incremental` | `rustc` [增量编译](https://course.rs/toolchains/cargo/reference/profiles.html#incremental)的输出,该缓存可以用于提升后续的编译速度 | +| `target/debug/build/` | [构建脚本](https://course.rs/toolchains/cargo/reference/build-script/intro.html)的输出 | ## 依赖信息文件 @@ -67,7 +67,7 @@ Cargo 还会创建几个用于构建过程的其它类型目录,它们的目 该文件往往用于提供给外部的构建系统,这样它们就可以判断 `Cargo` 命令是否需要再次被执行。 -文件中的路径默认是绝对路径,你可以通过 [`build.dep-info-basedir`](https://course.rs/cargo/reference/configuration.html#配置文件概览) 配置项来修改为相对路径。 +文件中的路径默认是绝对路径,你可以通过 [`build.dep-info-basedir`](https://course.rs/toolchains/cargo/reference/configuration.html#配置文件概览) 配置项来修改为相对路径。 ```shell # 关于 `.d` 文件的一个示例 : target/debug/foo.d @@ -81,4 +81,4 @@ Cargo 还会创建几个用于构建过程的其它类型目录,它们的目 为了设置 `sccache`,首先需要使用 `cargo install sccache` 进行安装,然后在调用 `Cargo` 之前将 `RUSTC_WRAPPER` 环境变量设置为 `sccache`。 - 如果用的 `bash`,可以将 `export RUSTC_WRAPPER=sccache` 添加到 `.bashrc` 中 -- 也可以使用 [`build.rustc-wrapper`](https://course.rs/cargo/reference/configuration.html#配置文件概览) 配置项 +- 也可以使用 [`build.rustc-wrapper`](https://course.rs/toolchains/cargo/reference/configuration.html#配置文件概览) 配置项 diff --git a/src/toolchains/cargo/guide/cargo-cache.md b/src/toolchains/cargo/guide/cargo-cache.md index 831a61fc..5bec0313 100644 --- a/src/toolchains/cargo/guide/cargo-cache.md +++ b/src/toolchains/cargo/guide/cargo-cache.md @@ -17,7 +17,7 @@ $ echo $HOME/.cargo/ ## 文件 -- `config.toml` 是 Cargo 的全局配置文件,具体请查看[这里](https://course.rs/cargo/reference/configuration.html) +- `config.toml` 是 Cargo 的全局配置文件,具体请查看[这里](https://course.rs/toolchains/cargo/reference/configuration.html) - `credentials.toml` 为 `cargo login` 提供私有化登录证书,用于登录 `package` 注册中心,例如 `crates.io` - `.crates.toml`, `.crates2.json` 这两个是隐藏文件,包含了通过 `cargo install` 安装的包的 `package` 信息,**请不要手动修改!** @@ -65,7 +65,7 @@ $ echo $HOME/.cargo/ 解决办法很简单: -- 既然下载慢,那就使用[国内的注册服务](https://course.rs/cargo/reference/specify-deps.html#从其它注册服务引入依赖包),不再使用 crates.io +- 既然下载慢,那就使用[国内的注册服务](https://course.rs/toolchains/cargo/reference/specify-deps.html#从其它注册服务引入依赖包),不再使用 crates.io - 耐心等待持有锁的用户构建完成 - 强行停止正在构建的进程,例如杀掉 IDE 使用的 rust-analyer 插件进程,然后删除 `$HOME/.cargo/.package_cache` 目录 diff --git a/src/toolchains/cargo/guide/dependencies.md b/src/toolchains/cargo/guide/dependencies.md index 851296b5..5ae02ddb 100644 --- a/src/toolchains/cargo/guide/dependencies.md +++ b/src/toolchains/cargo/guide/dependencies.md @@ -9,7 +9,7 @@ time = "0.1.12" ``` -可以看到我们指定了 `time` 包的版本号 "0.1.12",关于版本号,实际上还有其它的指定方式,具体参见[指定依赖项](https://course.rs/cargo/reference/specify-deps.html)章节。 +可以看到我们指定了 `time` 包的版本号 "0.1.12",关于版本号,实际上还有其它的指定方式,具体参见[指定依赖项](https://course.rs/toolchains/cargo/reference/specify-deps.html)章节。 如果想继续添加 `regexp` 包,只需在 `time` 包后面添加即可 : diff --git a/src/toolchains/cargo/guide/package-layout.md b/src/toolchains/cargo/guide/package-layout.md index a0b9f336..653adcc3 100644 --- a/src/toolchains/cargo/guide/package-layout.md +++ b/src/toolchains/cargo/guide/package-layout.md @@ -45,5 +45,5 @@ 关于 Rust 中的包和模块,[之前的章节](https://course.rs/basic/crate-module/intro.html)有更详细的解释。 -此外,`bin`、`tests`、`examples` 等目录路径都可以通过配置文件进行配置,它们被统一称之为 [Cargo Target](https://course.rs/cargo/reference/cargo-target.html)。 +此外,`bin`、`tests`、`examples` 等目录路径都可以通过配置文件进行配置,它们被统一称之为 [Cargo Target](https://course.rs/toolchains/cargo/reference/cargo-target.html)。 diff --git a/src/toolchains/cargo/reference/build-script/examples.md b/src/toolchains/cargo/reference/build-script/examples.md index cdba5d5f..9a7694de 100644 --- a/src/toolchains/cargo/reference/build-script/examples.md +++ b/src/toolchains/cargo/reference/build-script/examples.md @@ -250,7 +250,7 @@ fn test_crc32() { } ``` -代码很清晰,也很简洁,这里就不再过多介绍,运行 [`cargo build --vv`](https://course.rs/cargo/reference/build-script/intro.html#构建脚本的输出) 来看看部分结果( 系统中需要已经安装 `libz` 库): +代码很清晰,也很简洁,这里就不再过多介绍,运行 [`cargo build --vv`](https://course.rs/toolchains/cargo/reference/build-script/intro.html#构建脚本的输出) 来看看部分结果( 系统中需要已经安装 `libz` 库): ```shell [libz-sys 0.1.0] cargo:rustc-link-search=native=/usr/lib @@ -268,7 +268,7 @@ fn test_crc32() { 若你有一个依赖于 `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/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/toolchains/cargo/reference/build-script/intro.html#links) )。 ```toml # Cargo.toml diff --git a/src/toolchains/cargo/reference/build-script/intro.md b/src/toolchains/cargo/reference/build-script/intro.md index edd2842a..e2653d0f 100644 --- a/src/toolchains/cargo/reference/build-script/intro.md +++ b/src/toolchains/cargo/reference/build-script/intro.md @@ -28,9 +28,9 @@ fn main() { - 根据某个说明描述文件生成一个 Rust 模块 - 执行一些平台相关的配置 -下面的部分我们一起来看看构建脚本具体是如何工作的,然后在[下个章节](https://course.rs/cargo/reference/build-script/examples.html)中还提供了一些关于如何编写构建脚本的示例。 +下面的部分我们一起来看看构建脚本具体是如何工作的,然后在[下个章节](https://course.rs/toolchains/cargo/reference/build-script/examples.html)中还提供了一些关于如何编写构建脚本的示例。 -> Note: [`package.build`](https://course.rs/cargo/reference/manifest.html#build) 可以用于改变构建脚本的名称,或者直接禁用该功能 +> Note: [`package.build`](https://course.rs/toolchains/cargo/reference/manifest.html#build) 可以用于改变构建脚本的名称,或者直接禁用该功能 #### 构建脚本的生命期 @@ -121,7 +121,7 @@ Cargo 要求一个本地库最多只能被一个项目所链接,换而言之 ## 覆盖构建脚本 -当 `Cargo.toml` 设置了 `links` 时, Cargo 就允许我们使用自定义库对现有的构建脚本进行覆盖。在 [Cargo 使用的配置文件](https://course.rs/cargo/reference/configuration.html)中添加以下内容: +当 `Cargo.toml` 设置了 `links` 时, Cargo 就允许我们使用自定义库对现有的构建脚本进行覆盖。在 [Cargo 使用的配置文件](https://course.rs/toolchains/cargo/reference/configuration.html)中添加以下内容: ```toml [target.x86_64-unknown-linux-gnu.foo] diff --git a/src/toolchains/cargo/reference/cargo-target.md b/src/toolchains/cargo/reference/cargo-target.md index 609ca316..952a73a1 100644 --- a/src/toolchains/cargo/reference/cargo-target.md +++ b/src/toolchains/cargo/reference/cargo-target.md @@ -1,6 +1,6 @@ # Cargo Target -**Cargo 项目中包含有一些对象,它们包含的源代码文件可以被编译成相应的包,这些对象被称之为 Cargo Target**。例如[之前章节](https://course.rs/cargo/guide/package-layout.html)提到的库对象 `Library` 、二进制对象 `Binary`、示例对象 `Examples`、测试对象 `Tests` 和 基准性能对象 `Benches` 都是 Cargo Target。 +**Cargo 项目中包含有一些对象,它们包含的源代码文件可以被编译成相应的包,这些对象被称之为 Cargo Target**。例如[之前章节](https://course.rs/toolchains/cargo/guide/package-layout.html)提到的库对象 `Library` 、二进制对象 `Binary`、示例对象 `Examples`、测试对象 `Tests` 和 基准性能对象 `Benches` 都是 Cargo Target。 本章节我们一起来看看该如何在 `Cargo.toml` 清单中配置这些对象,当然,大部分时候都无需手动配置,因为默认的配置通常由项目目录的布局自动推断出来。 @@ -137,7 +137,7 @@ required-features = [] # 构建对象所需的 Cargo Features (N/A for lib). #### required-features -该字段用于指定在构建对象时所需的 [`features`](https://course.rs/cargo/reference/features.html) 列表。 +该字段用于指定在构建对象时所需的 [`features`](https://course.rs/toolchains/cargo/reference/features.html) 列表。 该字段只对 `[[bin]]`、 `[[bench]]`、 `[[test]]` 和 `[[example]]` 有效,对于 `[lib]` 没有任何效果。 @@ -155,7 +155,7 @@ required-features = ["postgres", "tools"] ## 对象自动发现 -默认情况下,`Cargo` 会基于项目的[目录文件布局](https://course.rs/cargo/guide/package-layout.html)自动发现和确定对象,而之前的配置项则允许我们对其进行手动的配置修改(若项目布局跟标准的不一样时)。 +默认情况下,`Cargo` 会基于项目的[目录文件布局](https://course.rs/toolchains/cargo/guide/package-layout.html)自动发现和确定对象,而之前的配置项则允许我们对其进行手动的配置修改(若项目布局跟标准的不一样时)。 而这种自动发现对象的设定可以通过以下配置来禁用: diff --git a/src/toolchains/cargo/reference/configuration.md b/src/toolchains/cargo/reference/configuration.md index 8b531482..c29febe4 100644 --- a/src/toolchains/cargo/reference/configuration.md +++ b/src/toolchains/cargo/reference/configuration.md @@ -1,6 +1,6 @@ # 通过 config.toml 对 Cargo 进行配置 -Cargo 相关的配置有两种,第一种是对自身进行配置,第二种是对指定的项目进行配置,关于后者请查看 [Cargo.toml 清单](https://course.rs/cargo/reference/manifest.html)。对于普通用户而言第二种才是我们最常使用的。 +Cargo 相关的配置有两种,第一种是对自身进行配置,第二种是对指定的项目进行配置,关于后者请查看 [Cargo.toml 清单](https://course.rs/toolchains/cargo/reference/manifest.html)。对于普通用户而言第二种才是我们最常使用的。 本文讲述的是如何对 Cargo 相关的工具进行配置,该配置中的部分内容可能会覆盖掉 `Cargo.toml` 中对应的部分,例如关于 `profile` 的内容。 @@ -95,7 +95,7 @@ offline = true # 不能访问网络 [patch.] # Same keys as for [patch] in Cargo.toml -[profile.] # profile 配置,详情见"如何在 Cargo.toml 中配置 profile" : https://course.rs/cargo/reference/profiles.html#profile设置 +[profile.] # profile 配置,详情见"如何在 Cargo.toml 中配置 profile" : https://course.rs/toolchains/cargo/reference/profiles.html#profile设置 opt-level = 0 debug = true split-debuginfo = '...' @@ -109,7 +109,7 @@ rpath = false [profile..build-override] [profile..package.] -[registries.] # 设置其它的注册服务: https://course.rs/cargo/reference/specify-deps.html#从其它注册服务引入依赖包 +[registries.] # 设置其它的注册服务: https://course.rs/toolchains/cargo/reference/specify-deps.html#从其它注册服务引入依赖包 index = "…" # 注册服务索引列表的 URL token = "…" # 连接注册服务所需的鉴权 token diff --git a/src/toolchains/cargo/reference/deps-overriding.md b/src/toolchains/cargo/reference/deps-overriding.md index 74466d7c..9129578c 100644 --- a/src/toolchains/cargo/reference/deps-overriding.md +++ b/src/toolchains/cargo/reference/deps-overriding.md @@ -9,7 +9,7 @@ 下面我们来具体看看类似的问题该如何解决。 -> 上一章节中我们讲了如果通过[多种引用方式](https://course.rs/cargo/reference/specify-deps/intro.html#多引用方式混合)来引入一个包,其实这也是一种依赖覆盖。 +> 上一章节中我们讲了如果通过[多种引用方式](https://course.rs/toolchains/cargo/reference/specify-deps/intro.html#多引用方式混合)来引入一个包,其实这也是一种依赖覆盖。 ## 测试 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. ``` -具体原因比较复杂,但是仔细观察,会发现克隆下来的 `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` 的版本是 `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/Cargo.toml" 中的 `version = "1.0.0-alpha.1"` 修改为 `version = "0.8.3"` ,然后看看结果先: @@ -173,7 +173,7 @@ uuid = { git = 'https://github.com/uuid-rs/uuid', branch = '2.0.0' } ## 多版本[patch] -在之前章节,我们介绍过如何使用 `package key` 来[重命名依赖包](https://course.rs/cargo/reference/specify-deps/intro.html#在-cargotoml-中重命名依赖),现在来看看如何使用它同时引入多个 `patch`。 +在之前章节,我们介绍过如何使用 `package key` 来[重命名依赖包](https://course.rs/toolchains/cargo/reference/specify-deps/intro.html#在-cargotoml-中重命名依赖),现在来看看如何使用它同时引入多个 `patch`。 假设,我们对 `serde` 有两个新的 `patch` 需求: @@ -196,7 +196,7 @@ serde2 = { git = 'https://github.com/example/serde', package = 'serde', branch = 有时我们只是临时性地对一个项目进行处理,因此并不想去修改它的 `Cargo.toml`。此时可以使用 `Cargo` 提供的路径覆盖方法: **注意,这个方法限制较多,如果可以,还是要使用 [patch]**。 -与 `[patch]` 修改 `Cargo.toml` 不同,路径覆盖修改的是 `Cargo` 自身的[配置文件](https://course.rs/cargo/guide/cargo-cache.html#cargo-home) `$Home/.cargo/config.toml`: +与 `[patch]` 修改 `Cargo.toml` 不同,路径覆盖修改的是 `Cargo` 自身的[配置文件](https://course.rs/toolchains/cargo/guide/cargo-cache.html#cargo-home) `$Home/.cargo/config.toml`: ```toml paths = ["/path/to/uuid"] diff --git a/src/toolchains/cargo/reference/features/intro.md b/src/toolchains/cargo/reference/features/intro.md index e91fa58d..03c03281 100644 --- a/src/toolchains/cargo/reference/features/intro.md +++ b/src/toolchains/cargo/reference/features/intro.md @@ -87,7 +87,7 @@ avif = ["ravif", "rgb"] 之后,`avif` feature 一旦被启用,那这两个依赖库也将自动被引入。 -> 注意:我们之前也讲过条件引入依赖的方法,那就是使用[平台相关的依赖](https://course.rs/cargo/reference/specify-deps.html#根据平台引入依赖),与基于 feature 的可选依赖不同,它们是基于特定平台的可选依赖 +> 注意:我们之前也讲过条件引入依赖的方法,那就是使用[平台相关的依赖](https://course.rs/toolchains/cargo/reference/specify-deps.html#根据平台引入依赖),与基于 feature 的可选依赖不同,它们是基于特定平台的可选依赖 ## 依赖库自身的 feature @@ -249,11 +249,11 @@ V2 版本的解析器可以在某些情况下避免 feature 同一化的发生 ## 构建脚本 -[构建脚本](https://course.rs/cargo/reference/build-script/intro.html)可以通过 `CARGO_FEATURE_` 环境变量获取启用的 `feauture` 列表,其中 `` 是 feature 的名称,该名称被转换成大全写字母,且 `-` 被转换为 `_`。 +[构建脚本](https://course.rs/toolchains/cargo/reference/build-script/intro.html)可以通过 `CARGO_FEATURE_` 环境变量获取启用的 `feauture` 列表,其中 `` 是 feature 的名称,该名称被转换成大全写字母,且 `-` 被转换为 `_`。 ## required-features -该字段可以用于禁用特定的 Cargo Target:当某个 feature 没有被启用时,查看[这里](https://course.rs/cargo/reference/cargo-target.html#required-features)获取更多信息。 +该字段可以用于禁用特定的 Cargo Target:当某个 feature 没有被启用时,查看[这里](https://course.rs/toolchains/cargo/reference/cargo-target.html#required-features)获取更多信息。 ## SemVer 兼容性 diff --git a/src/toolchains/cargo/reference/manifest.md b/src/toolchains/cargo/reference/manifest.md index 5dccea4b..ea413c1d 100644 --- a/src/toolchains/cargo/reference/manifest.md +++ b/src/toolchains/cargo/reference/manifest.md @@ -261,11 +261,11 @@ workspace = "path/to/workspace/root" - 该包是工作空间的根包(root crate),通过 `[workspace]` 指定) - 该包是另一个工作空间的成员,通过 `package.workspace` 指定 -若要了解工作空间的更多信息,请参见[这里](https://course.rs/cargo/reference/workspaces.html)。 +若要了解工作空间的更多信息,请参见[这里](https://course.rs/toolchains/cargo/reference/workspaces.html)。 #### build -`build` 用于指定位于项目根目录中的构建脚本,关于构建脚本的更多信息,可以阅读 [构建脚本](https://course.rs/cargo/reference/build-script/intro.html) 一章。 +`build` 用于指定位于项目根目录中的构建脚本,关于构建脚本的更多信息,可以阅读 [构建脚本](https://course.rs/toolchains/cargo/reference/build-script/intro.html) 一章。 ```toml [package] @@ -277,7 +277,7 @@ build = "build.rs" #### links -用于指定项目链接的本地库的名称,更多的信息请看构建脚本章节的 [links](https://course.rs/cargo/reference/build-script/intro.html#links) +用于指定项目链接的本地库的名称,更多的信息请看构建脚本章节的 [links](https://course.rs/toolchains/cargo/reference/build-script/intro.html#links) ```toml [package] @@ -390,9 +390,9 @@ maintenance = { status = "..." } ## [dependencies] -在[之前章节](http://course.rs/cargo/reference/specify-deps.html)中,我们已经详细介绍过 `[dependencies]` 、 `[dev-dependencies]` 和 `[build-dependencies]`,这里就不再赘述。 +在[之前章节](http://course.rs/toolchains/cargo/reference/specify-deps.html)中,我们已经详细介绍过 `[dependencies]` 、 `[dev-dependencies]` 和 `[build-dependencies]`,这里就不再赘述。 ## [profile.*] -该部分可以对编译器进行配置,例如 debug 和优化,在后续的[编译器优化](http://course.rs/cargo/reference/profiles.html)章节有详细介绍。 +该部分可以对编译器进行配置,例如 debug 和优化,在后续的[编译器优化](http://course.rs/toolchains/cargo/reference/profiles.html)章节有详细介绍。 diff --git a/src/toolchains/cargo/reference/profiles.md b/src/toolchains/cargo/reference/profiles.md index 9c407225..52c0681a 100644 --- a/src/toolchains/cargo/reference/profiles.md +++ b/src/toolchains/cargo/reference/profiles.md @@ -49,7 +49,7 @@ lto = true cargo build --profile release-lto ``` -与默认的 profile 相同,自定义 profile 的编译结果也存放在 [`target/`](https://course.rs/cargo/guide/build-cache.html) 下的同名目录中,例如 `--profile release-lto` 的输出结果存储在 `target/release-lto` 中。 +与默认的 profile 相同,自定义 profile 的编译结果也存放在 [`target/`](https://course.rs/toolchains/cargo/guide/build-cache.html) 下的同名目录中,例如 `--profile release-lto` 的输出结果存储在 `target/release-lto` 中。 ## 选择 profile @@ -257,7 +257,7 @@ codegen-units = 256 opt-level = 3 ``` -这里的 `package` 名称实际上是一个 [`Package ID`](https://course.rs/cargo/reference/package-id.html),因此我们还可以通过版本号来选择: `[profile.dev.package."foo:2.1.0"]`。 +这里的 `package` 名称实际上是一个 [`Package ID`](https://course.rs/toolchains/cargo/reference/package-id.html),因此我们还可以通过版本号来选择: `[profile.dev.package."foo:2.1.0"]`。 如果要为所有依赖包重写(不包括工作空间的成员): diff --git a/src/toolchains/cargo/reference/publishing-on-crates.io.md b/src/toolchains/cargo/reference/publishing-on-crates.io.md index d10b4ce3..395767d2 100644 --- a/src/toolchains/cargo/reference/publishing-on-crates.io.md +++ b/src/toolchains/cargo/reference/publishing-on-crates.io.md @@ -22,14 +22,14 @@ $ cargo login abcdefghijklmnopqrstuvwxyz012345 在发布之前,**确保** `Cargo.toml` 中以下字段已经被设置: -- [license 或 license-file](https://course.rs/cargo/reference/manifest.html#license和license-file) -- [description](https://course.rs/cargo/reference/manifest.html#description) -- [homepage](https://course.rs/cargo/reference/manifest.html#homepage) -- [documentation](https://course.rs/cargo/reference/manifest.html#documentation) -- [repository](https://course.rs/cargo/reference/manifest.html#repository) -- [readme](https://course.rs/cargo/reference/manifest.html#readme) +- [license 或 license-file](https://course.rs/toolchains/cargo/reference/manifest.html#license和license-file) +- [description](https://course.rs/toolchains/cargo/reference/manifest.html#description) +- [homepage](https://course.rs/toolchains/cargo/reference/manifest.html#homepage) +- [documentation](https://course.rs/toolchains/cargo/reference/manifest.html#documentation) +- [repository](https://course.rs/toolchains/cargo/reference/manifest.html#repository) +- [readme](https://course.rs/toolchains/cargo/reference/manifest.html#readme) -你还可以设置[关键字](https://course.rs/cargo/reference/manifest.html#keywords)和[类别](https://course.rs/cargo/reference/manifest.html#categories)等元信息,让包更容易被其他人搜索发现,虽然它们不是必须的。 +你还可以设置[关键字](https://course.rs/toolchains/cargo/reference/manifest.html#keywords)和[类别](https://course.rs/toolchains/cargo/reference/manifest.html#categories)等元信息,让包更容易被其他人搜索发现,虽然它们不是必须的。 如果你发布的是一个依赖库,那么你可能需要遵循相关的[命名规范](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 会自动根据版本控制系统的配置来忽略指定的文件,例如 `.gitignore`。除此之外,你还可以通过 [`exclude`](https://course.rs/cargo/reference/manifest.html#exclude和include) 来排除指定的文件: +当打包时,Cargo 会自动根据版本控制系统的配置来忽略指定的文件,例如 `.gitignore`。除此之外,你还可以通过 [`exclude`](https://course.rs/toolchains/cargo/reference/manifest.html#exclude和include) 来排除指定的文件: ```toml [package] @@ -91,7 +91,7 @@ $ cargo pulish 绝大多数时候,我们并不是在发布新包,而是发布已经上传过的包的新版本。 -为了实现这一点,只需修改 `Cargo.toml` 中的 [`version`](https://course.rs/cargo/reference/manifest.html#version) 字段 ,但需要注意:**版本号需要遵循 `semver` 规则**。 +为了实现这一点,只需修改 `Cargo.toml` 中的 [`version`](https://course.rs/toolchains/cargo/reference/manifest.html#version) 字段 ,但需要注意:**版本号需要遵循 `semver` 规则**。 然后再次使用 `cargo publish` 就可以上传新的版本了。 diff --git a/src/toolchains/cargo/reference/specify-deps.md b/src/toolchains/cargo/reference/specify-deps.md index 5dc239a2..5197ee66 100644 --- a/src/toolchains/cargo/reference/specify-deps.md +++ b/src/toolchains/cargo/reference/specify-deps.md @@ -145,7 +145,7 @@ regex = { git = "https://github.com/rust-lang/regex", branch = "next" } **因此不要依赖锁定来完成版本的控制,而应该老老实实的在 `Cargo.toml` 小心配置你希望使用的版本。** -如果访问的是私有仓库,你可能需要授权来访问该仓库,可以查看[这里](https://course.rs/cargo/git-auth.html)了解授权的方式。 +如果访问的是私有仓库,你可能需要授权来访问该仓库,可以查看[这里](https://course.rs/toolchains/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 进行查询。 -聪明的同学已经发现,这非常类似于条件依赖引入,那我们是不是可以根据自定义的条件来决定是否引入某个依赖呢?具体答案参见后续的 [feature](https://course.rs/cargo/reference/features.html) 章节。这里是一个简单的示例: +聪明的同学已经发现,这非常类似于条件依赖引入,那我们是不是可以根据自定义的条件来决定是否引入某个依赖呢?具体答案参见后续的 [feature](https://course.rs/toolchains/cargo/reference/features.html) 章节。这里是一个简单的示例: ```toml [dependencies] @@ -310,7 +310,7 @@ default-features = false # 不要包含默认的 features,而是通过下面 features = ["secure-password", "civet"] ``` -更多的信息参见 [Features 章节](https://course.rs/cargo/reference/features.html) +更多的信息参见 [Features 章节](https://course.rs/toolchains/cargo/reference/features.html) ## 在 Cargo.toml 中重命名依赖 diff --git a/src/toolchains/cargo/reference/workspaces.md b/src/toolchains/cargo/reference/workspaces.md index e3d7b751..976798f0 100644 --- a/src/toolchains/cargo/reference/workspaces.md +++ b/src/toolchains/cargo/reference/workspaces.md @@ -54,7 +54,7 @@ exclude = ["crates/proc_macro_test/imp"] 工作空间的几个关键点在于: - 所有的 `package` 共享同一个 `Cargo.lock` 文件,该文件位于工作空间的根目录中 -- 所有的 `package` 共享同一个[输出目录](https://course.rs/cargo/guide/build-cache.html),该目录默认的名称是 `target` ,位于工作空间根目录下 +- 所有的 `package` 共享同一个[输出目录](https://course.rs/toolchains/cargo/guide/build-cache.html),该目录默认的名称是 `target` ,位于工作空间根目录下 - 只有工作空间根目录的 `Cargo.toml` 才能包含 `[patch]`, `[replace]` 和 `[profile.*]`,而成员的 `Cargo.toml` 中的相应部分将被自动忽略 ## [workspace] @@ -67,7 +67,7 @@ members = ["member1", "path/to/member2", "crates/*"] exclude = ["crates/foo", "path/to/other"] ``` -若某个本地依赖包是通过 [`path`](https://course.rs/cargo/reference/specify-deps.html#通过路径引入本地依赖包) 引入,且该包位于工作空间的目录中,则该包自动成为工作空间的成员。 +若某个本地依赖包是通过 [`path`](https://course.rs/toolchains/cargo/reference/specify-deps.html#通过路径引入本地依赖包) 引入,且该包位于工作空间的目录中,则该包自动成为工作空间的成员。 剩余的成员需要通过 `workspace.members` 来指定,里面包含了各个成员所在的目录(成员目录中包含了 Cargo.toml )。 @@ -116,7 +116,7 @@ default-members = ["path/to/member2", "path/to/member3/foo"] ## workspace.metadata -与 [package.metadata](https://course.rs/cargo/reference/manifest.html#metadata) 非常类似,`workspace.metadata` 会被 `Cargo` 自动忽略,就算没有被使用也不会发出警告。 +与 [package.metadata](https://course.rs/toolchains/cargo/reference/manifest.html#metadata) 非常类似,`workspace.metadata` 会被 `Cargo` 自动忽略,就算没有被使用也不会发出警告。 这个部分可以用于让工具在 `Cargo.toml` 中存储一些工作空间的配置元信息。例如: diff --git a/内容变更记录.md b/内容变更记录.md index 81e973ee..57585172 100644 --- a/内容变更记录.md +++ b/内容变更记录.md @@ -57,15 +57,15 @@ ## 2022-03-03 -- 新增章节: [Cargo - 构建脚本示例](https://course.rs/cargo/reference/build-script/examples.html) +- 新增章节: [Cargo - 构建脚本示例](https://course.rs/toolchains/cargo/reference/build-script/examples.html) ## 2022-03-02 -- 新增章节: [Cargo - 构建脚本](https://course.rs/cargo/reference/build-script/intro.html) +- 新增章节: [Cargo - 构建脚本](https://course.rs/toolchains/cargo/reference/build-script/intro.html) ## 2022-02-28 -- 新增章节: [Cargo - 发布到crates.io](https://course.rs/cargo/reference/publishing-on-crates.io.html) +- 新增章节: [Cargo - 发布到crates.io](https://course.rs/toolchains/cargo/reference/publishing-on-crates.io.html) - 新增内容:[结构体 - #[derive(Debug)]](https://course.rs/basic/compound-type/struct.html#使用-derivedebug-来打印结构体的信息) ## 2022-02-27