
0 Rust 开始
编程语言的学习,语法并不是第一位的,途径是第一位的。从官方社区开始了解,官方教程途径、Rust应用途径、工具、构建、FAQ等。了解这些途径,尽管你不能第一时间想到问题的解决办法,但你总能想到到哪里能找到问题的解决方案。
Rust的代码开源在github上, https://github.com/rust-lang 包括 Rust,Cargo,等等。
既然我们有编程基础,那么不要严格按照顺序学习。哪些部分有兴趣,就先学哪部分。保持兴趣最重要。
官方教程
Rust 程序设计语言 简体中文版是开源的《The Rust Programming Language》的社区翻译版本。
Rust圣经提供了另一个版本,其中包括测验、 高亮、可视化等功能: https://rust-book.cs.brown.edu
另外有一个我非常喜欢的Rust中文教程: https://beatai.org/rust-course/about-book
这个教程还提供了一个配套习题:Rust 语言实战,这个练习参考了rust官方的《Rust by Example》,并且有中文版本!我们可以下载到本地浏览器阅读。
这里有一个文档路线:https://learnku.com/docs/nomicon/2018 点击文档可以看到更多。
官方的教程不能满足我的好奇心,总是有各种问题。如果阅读官方教程的同时,阅读三方教程,就能保证乐趣和知识系统性。
Rust的安装
使用 Rustup(推荐),可以帮助我们更新到最新rust版本,而其他第三方安装工具例如apt、yum之类的无法做到最新版本的更新。
参考官方安装步骤,非常简单:https://rust-lang.org/zh-CN/tools/install/
尝试执行 rustc --version 检测安装情况。
可以执行 rustup update 来升级 Rust。
在任何时候如果您想卸载 Rust,您可以运行 rustup self uninstall
Rust工具链
1 代码编辑器支持rust-analyzer
2 包管理、测试、构建 cargo
3 代码格式化 Rustfmt
4 代码错误检测与建议 Clippy
4 文档生成工具 Rustdoc
.
5 rustup 用于下载、管理、查看 rust 编译器
6 rustc Rust的编译器
在 Rust 开发环境中,所有工具都安装在~/.cargo/bin 目录中,您可以在这里找到包括 rustc、cargo 和 rustup 在内的 Rust 工具链。
.
Rust 开发者通常会将该目录加入 PATH环境变量中。
Cargo是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。
Rustfmt 格式化工具确保开发者遵循一致的代码风格。
Rust Language Server 为集成开发环境(IDE)提供代码补全和内联错误信息功能。
rustup
rustup命令行工具,帮助我们自动安装rust,更新rust,卸载rust,查看rust离线文档。
rustup --version # 查看rustup的版本
rustup update # 自动更新到最新的rust稳定版
rustup self uninstall # 卸载rust
rustup doc # 查看rust离线文档,包括rust官方教程、rust工具链文档、标准库文档、指南、rust风格、死岭书等各种能用到的文档都在这里导航
rustup which cargo # 查看cargo命令所在
rustup which rustc # 查看rustc编译器所在
windows默认位置:C:/Users/<user_name>/.rustup/toolchains/stable-x86_64-pc-windows-msvc/share/doc/rust/html/std/index.html
我们可以在本地的离线文档中,获得这些文档的线索:
1 官方教程文档
The Rust Programming Language 文字教程
Rust By Example 提供的案例教程
Rustlings 小型练习,帮你熟悉 Rust 代码的阅读与编写!
2 API文档
rust标准库文档,介绍了rust提供的各种功能的API使用方法
特别注意“重导出”也是一个路径
3 工具文档
cargo book
rustc book 另外还有rust error codes rust的编译器的错误码
rustdoc book
clippy book
4 其余
rust的开发参考资料,了解rust的灵感
rust发行日志
rust代码风格
rust unsafe book
rustc开发指南
rust嵌入式指南 book
rustc 编译命令
至少我们学会使用rustc编译一个.rs结尾的文件对吗?
rustc <source_rs_file_path> # 编译rs文件,得到同名不同后缀的编译结果文件
待探索,优化程度。
cargo 管理一切
cargo不仅管理项目,还管理了众多rust工具,通过cargo进行调用。例如rustdoc通过cargo doc调用,rustfix通过cargo fix调用,rustc通过cargo build调用。
rustdoc 文档生成与部署
rustdoc可以使用 cargo 直接调用,下面都使用cargo调用。
将代码中的注释,生成标准化crate文档,并生成网站部署。
执行cargo doc,然后在项目目录下回生成doc/子目录。
cargo doc --open 可以打开当前crate以及所依赖crate的全部文档
==cargo doc --open --no-deps== 可以阻止生成所有依赖的文档,提供文档生成速度。
cargo doc -p <crate-name> --open 可以指定查看某依赖的文档
可以访问 docs.rs 网站,并在搜索框中输入 crate 的名称。
生成文档的结构,以及注释需要保证的语法 0.1 API文档与标准库结构 0.2 rustdoc注释语法
项目管理
cargo new <directy-name> 创建一个目录并将项目结构所需内容新建在目录中。
cargo默认传参 —bin,创建用于生成二进制的源文件,如果传入—lib则创建库文件。
cargo还会初始化一个 Git 仓库,并生成一个.gitignore 文件。如果已存在git仓库则不会继续。
cargo可以帮助我们管理项目,我们需要遵守cargo预设目录结构才能让cargo正常管理。所以通常我们通过cargo自动创建合法的cargo项目。
会创建如下所示目录结构:
.
├── Cargo.toml
└── src
└── main.rs
也就是说src中的main.rs是主入口。
目录下有Cargo.toml的项目 manifest 文件,保存了项目的元数据。
Cargo 期望你的源文件位于 src 目录中。
项目根目录则只用来放 README、license 信息、配置文件,以及其他与代码无关的内容。
如果你一开始没有使用 Cargo 创建项目,也可以把它转换成一个使用 Cargo 的项目。只要把项目代码移到src 目录中,并创建一个合适的 Cargo.toml 文件即可。一个简单的办法是运行 cargo init,它会自动为你创建这个文件。
Cargo.toml主要是包含两部分的配置:[package] 部分,描述项目部分:name、version、edition
[dependencies] 部分,描述依赖:在 Rust 中,代码包被称为 crates。
依赖包可以有三种来源,crates.io官方,直接描述版本即可。github仓库需要指名仓库地址,本地来源需要指明path。
[dependencies]
rand = "0.3"
hammer = { version = "0.5.0"}
color = { git = "https://github.com/bjz/color-rs" }
geometry = { path = "crates/geometry" }
每个 crate 在 Cargo.toml 里独立声明自己的 edition(默认当前rust版本2024)。
- 编译器会按各自 Edition 规则分别解析,但最终生成相同的中间表示与二进制接口,可以无缝链接
cargo能调用rustc工具,所以可以构建和运行rust项目。
cargo build --verbose # 编译当前项目,并以详细模式展开
cargo run # 在build之后并运行编译后的可执行程序
D:\Programming\Rust\workspace\rust_study\hello_world > cargo build —verbose
Compiling hello_world v0.1.0 (D:\Programming\Rust\workspace\rust_study\hello_world)
Running C:\Users\xxx\.rustup\toolchains\stable-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name hello_world --edition=2024 src\main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=140 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=fb3d4ca8d9c5efcc --out-dir D:\Programming\Rust\workspace\rust_study\hello_world\target\debug\deps -C incremental=D:\Programming\Rust\workspace\rust_study\hello_world\target\debug\incremental -L dependency=D:\Programming\Rust\workspace\rust_study\hello_world\target\debug\deps
Finished dev profile [unoptimized + debuginfo] target(s) in 1.31s
cargo 会在 target/debug/<项目名> 生成一个可执行文件,而不是当前目录。
默认构建方式是调试构建(debug build),所以放在debug。cargo build --release能进行release构建。
Cargo能发现源文件有没有发生变化,没有变化则不会重复编译
rust的一大痛点是,编译漫长。所以通常我们并不能随便编译,而是使用快速检查来让编译器检查我们的代码。cargo check 直接在项目目录运行即可。
第三方crate的文档
几乎每个工具都会在安装目录附带使用文档docs目录之类的位置。当我们忘记某些内容的时候就能快速通过文档获取详细信息。
cargo install的crate都会下载源码的,所以我们到 ~/.cargo/registry/src/index.crates.io-xxx 中来看对应的crate的源码仓库中的文档即可。
另外一种是线上文档,在rustdoc提供的doc网站上应该能查询到,或者在crates.io网站对应的crate也会提供doc的网站。
.
可以访问docs.rs 网站,并在搜索框中输入 crate 的名称。
包管理
cargo search <crate-name>在 crates.io 中搜索类似名字的 crate。
cargo add <crate-name> 在 crates.io 中将对应名字的crate直接下载下来并添加到当前crate的依赖管理中。
所有下载的cretas会保存在~/.cargo/registry中,防止重复拉取。
原本的索引会全部拉取到本地,第一次拉取的时候是全量拉取。非常的慢。而稀疏索引则根据我们依赖的项目名称,分析出项目所在的“hash桶”仓库地址,从而拉取更少的索引。
- 例:
serde→https://index.crates.io/se/rd/serde - 例:
tokio→https://index.crates.io/to/ki/tokio
cargo.toml的配置并不明确,我们只指定了要用的依赖版本范围。cargo在build的时候会计算具体需要用依赖的哪个版本,并且计算出依赖关系树,以及一些其他信息,保存在cargo.lock文件中。之后的cargo build,run时如果cargo.toml没变则会直接使用cargo.lock文件中的具体数值,而不会重新计算版本导致每次build依赖版本都不一样。
cargo update能强行升级所有依赖。
所以当我们的cargo项目是二进制项目,我们需要确切的版本号,请将cargo.lock加入版本管理。
当我们的项目是lib项目,我们应该保持项目依赖的范围,这样别的程序将我们的库作为依赖,就可以计算更适合他的依赖版本,而不是被我们的精确的依赖限定死他项目的依赖。所以此时不要将cargo.lock加入版本管理。
cargo 编译10GB 缓存
这并不是一个 bug。它更像是为了编译速度和运行时性能而做出的一个权衡,Cargo 把所有认为有用的信息都缓存下来了
全量清理 (cargo clean)
智能清理 (cargo sweep)
以及一些特定场景的操作…
减少重复编译:在项目根目录的 .cargo/config.toml 文件中增加 [build] 配置,指向一个绝对的公共路径,这样所有项目共享同一个编译缓存,避免同一份依赖被反复编译
限制历史版本:在你的全局 Cargo 配置(~/.cargo/config.toml)中,可以设置保留的 registry 的版本数量。
链接而非复制:在 Windows 上,设置 [unstable] 下的 link-lib-rs 选项,可以让多个 crate 共享相同的系统库,而不是各自复制一份。
VS Code 插件
rust-analyzer作为 Rust 语言的插件Even Better TOML,支持 .toml 文件完整特性
Error Lens, 更好的获得错误展示One Dark Pro, 非常好看的 VSCode 主题CodeLLDB, Debugger 程序
下一节 1 Rust变量与类型
