卷 I · 门槛CH 03深度 03/24

装好工具链,然后忘了它

好消息:Rust 让你劝退的地方全在语言里,不在工具链里。它的工具链是这门语言体验最好的部分之一 —— 一条命令装完,一个 cargo 打包了构建、依赖、测试、格式化。这一章我们快速过一遍,好把宝贵的注意力,全部留给后面真正难的东西。

rustupcargorust-analyzeredition

三个名字,先分清

Rust 的工具链里,你会反复见到三个名字。它们各司其职,别混:

  • rustc —— 编译器本体。把 .rs 源码编成可执行文件。你几乎永远不会直接调用它,它藏在 cargo 底下。
  • cargo —— 项目与包管理器,你 99% 的时间在跟它打交道。构建、运行、测试、加依赖、发布,全是它。相当于把 npm / gradle / pip 的活,一个工具全包了。
  • rustup —— 工具链的安装与版本管理器。装 Rust、升级 Rust、切换 stable / nightly、加编译目标(比如交叉编译到 wasm),都归它。相当于 Node 世界的 nvm。

安装:一条命令

rustup.rs,把那条命令粘到终端里跑(macOS / Linux 是一行 curl,Windows 下个安装器)。它会装好 rustc、cargo、rustup,一次到位。装完验证一下:

$ rustc --version
rustc 1.xx.0

$ cargo --version
cargo 1.xx.0

以后升级也只要一句 rustup update。它不像有些语言那样要你手动管一堆版本、纠结虚拟环境 —— 装好基本就不用再操心了。

▶ 如果你不想现在装

完全可以先不装。这本书所有的互动 Demo 都在网页里跑,读和玩都不需要本地环境。想动手写真代码时,还有个零安装的选择:官方在线运行环境 Rust Playgroundplay.rust-lang.org),打开就能编译运行,甚至能一键看它编译成的汇编。等你确定要认真写了,再花五分钟装本地工具链不迟。

cargo:你会天天用的那几条

建一个新项目,从这里开始:

$ cargo new hello
     Created binary (application) `hello` package

$ cd hello
$ cargo run
   Compiling hello v0.1.0
    Finished dev [unoptimized + debuginfo]
     Running `target/debug/hello`
Hello, world!

cargo new 给你一个标准骨架:一个 src/main.rs(入口,里面就是个打印 Hello 的 main),一个 Cargo.toml(项目清单)。你日常真正会敲的命令,扳手指数得完:

命令干什么
cargo run编译并运行(开发时最常用)
cargo build只编译,产物在 target/;加 --release 出优化版
cargo check只做类型 / 借用检查,不生成机器码,快得多。改代码时反复跑它
cargo test跑所有测试(测试是语言内建的,第 22 章讲)
cargo add serde加一个依赖,自动写进 Cargo.toml
cargo fmt按官方风格自动格式化,团队再不用吵缩进
cargo clippy跑 lint,给「更地道写法」的建议

一个高频习惯先剧透:写代码的循环不是「改 → cargo run」,而是「改 → cargo check」。因为你学 Rust 的大部分时间,是在和类型与借用检查打交道 —— 你想知道的是「编译器满不满意」,而不是「跑出来啥」。cargo check 跳过了生成机器码那一步,反馈快很多。

Cargo.toml 与 crates.io

Cargo.toml 是项目清单,长这样:

[package]
name = "hello"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = { version = "1", features = ["derive"] }
rand = "0.8"

依赖来自 crates.io —— Rust 的中央包仓库,相当于 npm registry / Maven Central。生态非常活跃:序列化用 serde、异步运行时用 tokio、Web 框架用 axum、错误处理用 anyhow / thiserror…… 你想要的轮子,基本都有人造好了。加依赖不用手写,cargo add rand 就行。

注意那行 edition = "2021" —— 这是个 Rust 特有的好设计,值得单独说一句。

edition:语言进化,但不背叛你的旧代码

Rust 每三年出一个「版次」(edition):2015、2018、2021、2024。版次允许语言引入一些不向后兼容的改进(比如关键字调整、默认行为变化),但妙就妙在:不同版次的 crate 可以在同一个项目里无缝共存。你的老代码标着 edition = "2015",可以一直编译通过、永不被抛弃;新项目用 2024 享受新特性。语言得以持续进化,又不制造「Python 2 到 3」那种全社区撕裂的大迁移。你现在只要知道:新项目就用最新版次,别多想。

最该装的那个:rust-analyzer

如果这一章你只做一件事,做这件:在你的编辑器里装上 rust-analyzer。VS Code 直接搜这个名字装扩展,JetBrains 系用 RustRover 或 IDEA 的 Rust 插件,Neovim / Emacs 也都支持。

为什么它对学 Rust格外重要?因为它把编译器的反馈,从「你敲完命令」提前到了「你敲完这一行」。所有权错误、类型不匹配、没用的变量 —— 在你写下的当下就标红线,鼠标一悬停就是完整的 rustc 解释,还能一键应用修复建议。

回想上一章说的:学 Rust 的核心,是建立「此刻这个值归谁、谁能碰它」的直觉。这种直觉是靠大量的「我以为对 → 它说不对 → 哦原来如此」循环喂出来的。rust-analyzer 把这个循环的周期从分钟压到秒 —— 它让你在一个下午里,能撞上并理解几十次借用问题,而不是几次。它可能是让你「过墙」最快的那一个工具。

◆ 一句话记住工具链的分工

rustup 管「你装了哪个版本的 Rust」,cargo 管「你的项目怎么构建和依赖」,rustc 埋头干活你别管,rust-analyzer 在你打字时实时替你预演编译。四个各就各位,你日常只需要惦记 cargo 的那六七条命令。

然后 —— 就像标题说的 —— 忘了它。工具链不会是劝退你的地方。把省下的每一分注意力,都交给下一卷:所有权。

回流

⟲ 回流 · 一个 cargo,抵得上你熟悉的一堆工具

如果你来自 JVM 世界:cargo ≈ Gradle/Maven(构建 + 依赖)+ 但没有那些 XML/DSL 的地狱配置;crates.io ≈ Maven Central;cargo test ≈ JUnit 但内建进语言、零配置;cargo fmt ≈ ktlint/spotless;cargo clippy ≈ detekt/SonarQube。区别是:在 Rust 里这些不是你要东拼西凑的第三方插件,而是官方一套、开箱即用、风格统一

如果你来自 JS 世界:rustup ≈ nvm,cargo ≈ npm + 但 lockfile、workspace、脚本、测试 runner 全内建,不用在 webpack/vite/jest/eslint/prettier 之间搭一整套。Rust 官方把「工具疲劳」这件事,几乎从源头消灭了。这大概是为什么大家一边被语言劝退,一边又对它的工具链赞不绝口。

这一章的一句话

装 Rust 是这门语言最不折磨人的部分:一条命令装好,一个 cargo 全包,一个 rust-analyzer 让你实时看到编译器的想法。工具链就绪,门槛这一卷也就走完了。

下一章开始,我们挖地基。第一铲,就挖向那个让所有人第一次懵掉的地方 —— 为什么 let b = a 之后,a 就不见了。