跳转至

03 欲善其事,先利其器:开发环境搭建

你好,我是鸟窝。这节课我来带你搭建起Rust的编程环境。

如果你已经对 Rust 有所了解,并且对 Rust 程序的开发环境已经熟悉,可以跳过本章。如果你是一个 Rust 的初学者,你可以参考本章的内容,搭建好 Rust 的开发环境。

rustup 和 cargo

安装 Rust 相关工具常用方式是使用 rustup, 这是一个 Rust 的安装和更新工具,它可以帮助你安装 Rust 和相关的工具链。你可以到网站了解详细信息。当然你访问这个网站的时候,首页会告诉你安装 rustup 命令最简单的方法:

图片

执行那个 curl 命令会一步一步带你安装 Rust 相关工具。

首先是一些介绍。

接下来是一个默认选项,如果没有特别的,你就输入 1,选择默认安装即可。

图片

但是如果你想要些不同的,那么你就选择 2,它会一步一步提示你选择,比如下面我选择安装 Rust 的 nightly 版本,这样我就能测试 Rust 最新的不稳定的特性。

不过不用担心,以后你还可以修改安装不同的选项。

图片

当然如果上面安装 rustup 的时候因为某种原因不能下载和访问,你也可以使用国内的镜像,比如字节跳动的镜像 RsProxy,比如你设置环境变量,最好把它写入到 ~/.zshrc 或者 ~/.bashrc:

export RUSTUP_DIST_SERVER="https://rsproxy.cn"
export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup"

然后使用下面的命令安装:

curl --proto '=https' --tlsv1.2 -sSf https://rsproxy.cn/rustup-init.sh | sh

完成上面的安装以后,Rust 相应的工具,比如 Rust 编译器、cargo 工具都已经安装成功了。有时候国内访问和下载 crate 很慢,你也可以修改相关的配置,从国内的镜像拉取,比如我们还是使用 RsProxy 网站的镜像:

[source.crates-io]
replace-with = 'rsproxy'
[source.rsproxy]
registry = "https://rsproxy.cn/crates.io-index"
[source.rsproxy-sparse]
registry = "sparse+https://rsproxy.cn/index/"
[registries.rsproxy]
index = "https://rsproxy.cn/crates.io-index"
[net]
git-fetch-with-cli = true

如果可能,你还可以使用 sparse 优化 crate 的索引和下载。默认情况下,cargo 会使用基于 Git 的 index(也是前面的默认配置)。但是随着 index 体积增大,利用 git 拉取全量 index 逐渐变得缓慢(上百兆的 git 仓库即便是国内环境依旧较慢)。Sparse Index 可以进行优化,目前该功能在 nightly 版本下已可用。

[source.crates-io]
replace-with = 'rsproxy-sparse'
[source.rsproxy]
registry = "https://rsproxy.cn/crates.io-index"
[source.rsproxy-sparse]
registry = "sparse+https://rsproxy.cn/index/"
[registries.rsproxy]
index = "https://rsproxy.cn/crates.io-index"
[net]
git-fetch-with-cli = true

国内有很多 Rust crate 的镜像,尤其是一些知名的大学,下面都是一些国内的镜像,你可以选择合适的源:

# 放到 `$HOME/.cargo/config` 文件中
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"

# 替换成你偏好的镜像源
replace-with = 'rsproxy-sparse'

# 清华大学
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"

# 中国科学技术大学
[source.ustc]
registry = "https://mirrors.ustc.edu.cn/crates.io-index"
# 或者
# registry = "git://mirrors.ustc.edu.cn/crates.io-index"

# 上海交通大学
[source.sjtu]
registry = "https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index"

# 字节跳动源
[source.rsproxy]
registry = "https://rsproxy.cn/crates.io-index"

[source.rsproxy-sparse]
registry = "sparse+https://rsproxy.cn/index/"

[registries.rsproxy]
index = "https://rsproxy.cn/crates.io-index"

[net]
git-fetch-with-cli = true

编辑器

一个好的编辑器可以达到事半功倍的效果,不过这都是老黄历了,随着 AI 技术的快速发展,一个带 AI 智能助手的编辑器可以达到十倍的效果,所以接下来我介绍几款好用的编辑器,这也是我经常使用的编辑器。RustCover 是 JetBrain 公司的 Rust 编辑器,因为是商业产品,我就不介绍了。Rust.Vim 我也不会介绍,因为这是过于极客的编辑器。

VS Code

Visual Studio Code(简称 VS Code)是由微软开发的一款免费、开源的轻量级代码编辑器。它是现代软件开发中常用的工具之一,广泛支持多种编程语言和工作流。以下是 VS Code 的一些关键特性:

  • 轻量级但功能强大:VS Code 体积较小,运行速度快,适合不同规模的项目,无论是小型脚本还是大型代码库。此外,它既支持基本的文本编辑功能,又包含强大的代码编辑能力,如语法高亮、智能代码补全(IntelliSense)、代码导航等。
  • 多语言支持:VS Code 支持多种编程语言,包括但不限于:JavaScript、TypeScript、Python、Go、Rust、C/C++ 通过插件(Extensions),可以添加对更多语言的支持或增强现有语言的功能。
  • 扩展功能:VS Code 拥有丰富的扩展市场,用户可以根据需要安装插件来增强编辑器的功能。
  • 集成调试器:VS Code 提供内置调试功能,支持多种语言的调试器。用户可以直接在代码编辑器中设置断点、单步调试、查看变量、输出调试信息等。
  • 终端集成:VS Code 内部集成了终端功能,用户可以在不离开编辑器的情况下运行命令行操作,执行脚本、编译代码、查看日志等。
  • 跨平台:VS Code 支持跨平台,能够在 Windows、macOS 和 Linux 系统上流畅运行,极大地方便了开发者在不同操作系统间的协作。
  • 远程开发:VS Code 提供了远程开发功能(Remote Development),允许用户连接到远程服务器进行开发。这对于需要在云端或虚拟机上开发的项目非常有用。
  • AI 支持:因为是微软旗下的产品,VS Code 很早就得到了 Copilot 的支持,而且很是火了一阵子,现在在 Cursor 的新的编辑器的竞争下,Copilot 也在快速进化。

在 VS Code 中,通过安装特定的扩展可以为 Rust 提供强大的开发支持,使得 Rust 开发变得高效便捷。目前我们常常使用的插件是 Rust Analyzer。这是最流行的 Rust 插件,提供全面的 Rust 开发支持。它由 Rust 社区维护,并且是官方推荐的工具。该插件提供智能代码补全、代码导航、错误提示、重构工具、格式化工具等功能。安装 Rust Analyzer 后,VS Code 对 Rust 的支持将变得非常强大。

图片

Zed

Zed 编辑器是一款相对较新的代码编辑器,由 Nathan Sobo 和他的团队开发,Nathan Sobo 曾是 Atom 编辑器的核心开发者之一。Atom 编辑器原来是 GitHub 自己开发的编辑器,一出来很是惊艳,但是随着 VS Code 的崛起,Atom 编辑器暗淡下去了,但是开发者 Nathan Sobo 还是有编辑器开发的执念,他创建了基于 GPU 的快速相应的编辑器。另外的开发者 Max BrunsfeldAntonio Scandurra同样是 Zed 项目的核心开发者,之前也参与过 Atom 编辑器的开发工作。

Zed 的设计目标是提供一个速度快、响应迅速、支持协作的现代代码编辑器。它通过使用 Rust 编程语言构建的自定义引擎,确保了高性能和低延迟。

Zed 编辑器的功能聚焦于高性能、实时协作、专注模式和现代设计。Zed 的目标用户主要是对性能有较高要求的开发者,特别是那些在处理大型代码库或需要协作功能的开发者。它还适合那些希望使用现代编辑器的开发者,这些人可能对传统的基于 Electron 的编辑器(如 Atom 和 VS Code)的性能感到不满。

Zed 原来最主要的目标之一就是高性能,通过 GPU 的加持渲染确实非常快,但是,随着最近智能编辑器的大火,他们的目标也不得不进行调整,最开始是慢慢的 Copilot 插件的引入,最近有主攻各种大模型的 AI 辅助编码,也是紧跟时代潮流。

图片

Zed 编辑器就是使用 Rust 开发的,所以必然的 Rust 是它第一要支持的编程语言。Zed 也是集成了 Rust Analyzer。

Cursor

本来 Copilot 在 VS Code 中的代码,就让大家很惊艳了,没想到代码辅助可以提高那么多的生产力:自动的代码生成,单元代码自动产生、代码辅助分析、代码注释自动添加、检查代码中的错误等等。在我们在逐步熟悉 Copilot 的各项功能的同时,Copilot 的新特性也不再像刚开始的时候层出不穷。

就在大家以为代码助手就这样的时候,又出来一个王炸,也就是 Cursor 这个编辑器。它默认使用当前 claude-3.5-sonnet 当前最好的代码大数据模型之一,让代码复制编程的想象力天花板又达到了新的高度。

它不仅仅有 Copilot 常见的代码自动生成这种我们已经熟悉的基本功能,还可以根据提示,给你生成一个完整的代码项目,包括前后端的代码,甚至配置文件,而你只需和它交谈几次,让它修改几次小错误,做一些美化,就可以完成一个项目。

你还可以让它基于整个项目,生成项目的 quick start 等文档。甚至对于一个不会编程的人来说,它都可以帮助你完成整个编程项目。虽然目前生成的项目还是比较简单,可是这已经非常炸裂了。你甚至可以看到几岁的小孩完全用 Cursor 生成一个游戏。

我花了一个小时的时间,使用 Cursor 生成了一个 IP 地理信息查询的网站: https://ip.rpcx.io 简直是太爽了。因为 Cursor 也是基于 VS Code 开发的,所以它天然支持 Rust Analyzer 插件,也就是完全支持 Rust 开发,还有 AI 的加持。

图片

Cursor 当前可以试用,试用期过后你就需要购买才能使用它的 AI 功能了,或者换新的账号。

一个简单的 Rust 项目

Rust 项目通常使用 Cargo 来管理。以下是创建和运行一个简单 Rust 项目的步骤:

  1. 创建新项目
   cargo new hello_world
   cd hello_world

生成的项目的文件结构如下:

图片

Cargo 已经创建了一个名为 Cargo.toml 的文件来保存项目的元数据,目前这个文件还没有多少内容:

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

[dependencies]

如果你想增加第三方依赖,比如 rand crate,你可以在这个目录下执行 cargo add rand

cargo add rand
Updating `tuna` index
  Adding rand v0.8.5 to dependencies
         Features:
         + alloc
         + getrandom
         + libc
         + rand_chacha
         + std
         + std_rng
         - log
         - min_const_gen
         - nightly
         - packed_simd
         - serde
         - serde1
         - simd_support
         - small_rng
 Locking 16 packages to latest compatible versions
  Adding wasi v0.11.0+wasi-snapshot-preview1 (latest: v0.13.2+wasi-0.2.1)
  Adding zerocopy v0.7.35 (latest: v0.8.2)
  Adding zerocopy-derive v0.7.35 (latest: v0.8.2)

也可以直接修改这个文件,编译或者运行的时候自动下载第三方库:

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

[dependencies]
rand = "0.8.5"

Cargo 已经为我们的项目配制好了 git,它增加了 .git 目录和 .gitignore 文件。如果你不想配置 git, 你可以在 cargo new 时候增加 --vcs none 来禁用版本控制。

  1. 编辑 src/main.rs,默认情况下 src 目录下会有一个 main.rs 简单的程序,它是 main 程序的初始模板,你可以在此基础上编写复杂的程序:
   fn main() {
       println!("Hello, world!");
   }

比如我们修改为输出一个随机的数字:

fn main() {
    println!("{}", rand::random::<i32>());
}
  1. 构建和运行:
   cargo run

库项目

如果我们想创建一个库项目,那么可以在 cargo new 的时候传入--lib

  1. 使用 cargo new my_library --lib 创建库项目。
  2. src/lib.rs 中定义公共 API。
  3. 使用 cargo build 构建库。
  4. 其他项目可以通过在 Cargo.toml 中添加依赖来使用这个库。
  5. 或者在此项目中增加 main.rs,实现可执行文件,同时也可以引用这个库。

多个执行程序的项目

Cargo 支持在一个项目中包含多个二进制程序,至少有两种方式:

[workspace]
members = ["member1", "path/to/member2", "crates/*"]
exclude = ["crates/foo", "path/to/other"]

可以包含多个 members,甚至可以写成通配符的方式。

  • 多个 bin。可以在 bin 目录下写多个 main 程序,运行的时候通过 --bin 指定要运行的 main 程序。

我们配套的代码同时采用这两种形式。每一章是一个单独的 member,每个 member 中又采用第二种形式,实现多个可执行程序。

第二种形式一般如下:

  1. src/bin 目录下创建多个 .rs 文件,每个文件对应一个可执行程序。
  2. 例如,创建 src/bin/program1.rssrc/bin/program2.rs
  3. 使用 cargo run --bin program1 来运行特定的程序。

总结

这节课我们详细介绍了如何为 Rust 开发环境配置工具和编辑器,并展示了一个简单的 Rust 项目的创建过程,我们一起来回顾一下。

Rust 环境安装

  1. rustup:我们首先介绍了 rustup,这是安装和更新 Rust 的工具。通过访问官方安装网站,用户可以根据需要选择默认安装或自定义安装(如选择 nightly 版本)。
  2. 国内镜像:为了提高下载速度,我建议你使用国内镜像源(如 RsProxy、清华大学、上海交通大学等)的配置方法。
  3. cargo:Rust 的包管理工具,用于管理依赖和构建项目。

编辑器选择

  1. VS Code:我推荐使用 Visual Studio Code(VS Code)作为 Rust 开发的编辑器。VS Code 是一款轻量级、功能强大的代码编辑器,支持多种编程语言和插件。通过安装 Rust Analyzer 插件,VS Code 可以提供智能代码补全、代码导航等功能,提升 Rust 开发效率。
  2. Zed 编辑器:Zed 是一款由 Rust 开发的编辑器,专注于高性能、实时协作和现代设计,适合对性能要求较高的开发者。
  3. Cursor 编辑器:Cursor 编辑器结合了 AI 技术,提供智能代码生成和协作功能,可以生成完整的项目并进行优化,适合需要快速开发的场景。
  4. 创建 Rust 项目:使用 cargo new 创建一个新的 Rust 项目,并展示项目结构。默认生成的 Cargo.toml 文件用于管理项目的元数据和依赖。最后我还演示了如何添加第三方库(如 rand crate),并通过修改 Cargo.toml 文件来管理项目依赖。

思考题

如果你已经熟悉了Rust的编程开发,可以略过本节课。如果你还未曾接触过Rust开发,就请你尝试创建一个Rust Hello World项目。

期待你的分享。如果今天的内容对你有所帮助,也期待你转发给你的同事或者朋友,大家一起学习,共同进步。我们下节课再见!

⏰ 小编提醒:首次直播时间在3月11号晚8点,进课程交流群蹲直播链接🔗,直播答疑问题提交点这里

精选留言(1)
  • dj_ukyo 👍(0) 💬(1)

    1. 一个问题,兼容性好的运行方式 1. 一般来说rust程序有三种运行方式: 1. filename.rs 单文件,先编译,再运行,不需要项目信息,一个文件搞定一切

    rustc filename.rs
    .&#47;a.out
    
    1. cargo 方式,这是主流方式,没什么不好,仅仅是当我只是需要单独运行两个片段的时候,略重 1. cargo script filename.rs, 将rust当场脚本来用,优势是简洁 1. 当第一行设好 Shebang 之后,就更加简洁 1. 于是我想要一个在三种情况下均能运行的模板,当前尚未找到,针对引入三方库的情况带来了复杂度 ```rust #!/usr/bin/env run-cargo-script //! ```cargo //! [package] //! edition = "2024" //! //! [dependencies] //! rayon = "1.10.0" //! ``` fn main() { println!("hello rust template"); } ```

    2025-03-02