跳到主要内容Rust 语言入门:从环境搭建到发布第一个 CLI 工具 | 极客日志Rust
Rust 语言入门:从环境搭建到发布第一个 CLI 工具
综述由AI生成Rust 语言入门指南涵盖核心价值分析、多平台环境搭建及国内镜像源配置。通过 Cargo 构建首个 CLI 工具,演示了编译、运行、测试、调试及发布至 crates.io 的全流程。重点解析了变量可变性、Result 类型处理、所有权机制及生命周期管理等新手易错点,并提供具体代码示例与避坑方案,帮助开发者快速掌握 Rust 基础开发技能。
PhpPioneer30 浏览 第 1 篇:Rust 语言入门全攻略——从'为什么选 Rust'到写出第一个可发布的 Hello, Rust!
一、为什么要学习 Rust?——理解 Rust 的核心价值与应用场景
1.1 新手最关心的三个问题
作为接触过大量刚入门或想转 Rust 的开发者,他们问得最多的三个问题是:
- Rust 难学吗?
💡 客观讲,Rust 有一定学习门槛(主要是内存安全机制和所有权系统),但只要遵循循序渐进的学习路径,有其他语言基础(哪怕是 Python 这种非系统语言),通常 1-2 个月就能上手开发简单项目,3-6 个月能熟练写生产级代码。
- Rust 适合做什么?
✅ 系统级开发:操作系统内核(如 Redox)、驱动程序、嵌入式系统(ESP32/STM32 等支持 Rust)
✅ 网络编程:高性能服务器(如 Tokio 框架的异步服务器)、区块链(如 Solana)
✅ 工具开发:Docker Desktop、GitLab CI Runner、GitHub Copilot 的后端引擎
✅ WebAssembly:前端性能瓶颈优化(如 Yew/Tauri 框架开发桌面 Web 混合应用)
- Rust 比 C/C++ 好在哪?
🚀 内存安全:通过所有权、借用、生命周期三大核心机制,在编译期就杜绝了空指针、野指针、内存泄漏等 C/C++ 常见的安全问题,无需 GC(垃圾回收)
🚀 高性能:与 C/C++ 旗鼓相当,无运行时开销
🚀 生态系统:Cargo 包管理工具非常强大,crates.io(Rust 的 PyPI)有超过 150 万个开源库
🚀 语法现代化:支持模式匹配、泛型、异步编程、迭代器等现代语言特性
1.2 真实案例:Rust 在生产环境中的应用
📝 案例 1:Microsoft Azure 用 Rust 重构 Sway 防火墙
Microsoft Azure 的 Sway 防火墙原来用 C++ 开发,存在大量安全漏洞和内存泄漏问题。2021 年,Azure 团队用 Rust 重构了核心模块,安全漏洞减少了 90%,性能提升了 20%。
📝 案例 2:Cloudflare 用 Rust 开发 Wrangler CLI 工具
Cloudflare Workers 的官方 CLI 工具 Wrangler,原来用 Node.js 开发,下载依赖慢、启动时间长。2022 年,Cloudflare 团队用 Rust 重构了 Wrangler,启动时间从 30 秒缩短到 1 秒,下载依赖速度提升了 5 倍。
二、Rust 开发环境搭建全流程——Windows/macOS/Linux 通用方案
2.1 统一安装工具:rustup
💡 rustup 是 Rust 官方唯一推荐的安装工具,它可以:
- 安装和管理多个 Rust 版本(如稳定版、测试版、nightly 版)
- 安装和管理不同的工具链(如 x86_64-unknown-linux-gnu、wasm32-unknown-unknown)
- 配置 Rust 的环境变量和镜像源
2.1.1 Windows 安装
⚠️ 注意:Windows 用户需要先安装 Visual Studio Build Tools(C++ 编译器),否则无法编译 Rust 程序。
- 访问 Rust 官方网站:https://www.rust-lang.org/zh-CN/
- 点击'下载 Rust 安装程序',选择'Windows (64-bit)'
- 运行下载的
rustup-init.exe,选择默认选项(按 1 键)
安装完成后,验证安装:
打开 PowerShell 或命令提示符,输入以下命令:
rustc --version
cargo --version
✅ 成功标志:显示 rustc 1.78.0 (9b00956e5 2024-04-29) 和 cargo 1.78.0 (54d8815d0 2023-03-26) 类似的版本信息
2.1.2 macOS 安装
- 打开终端(Terminal)
- 输入以下命令下载并运行 rustup 安装脚本:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustc --version
cargo --version
2.1.3 Linux 安装(以 Ubuntu/Debian 为例)
sudo apt update && sudo apt install -y build-essential curl git
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustc --version
cargo --version
2.2 配置国内镜像源——加速依赖下载
⚠️ 警告:由于网络原因,直接从 crates.io 下载依赖可能会非常慢,甚至失败。建议配置国内镜像源。
- 创建或编辑
~/.cargo/config.toml 文件(Windows 用户路径是 C:\Users\你的用户名\.cargo\config.toml)
- 保存并退出
[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
2.3 配置开发工具
推荐使用VS Code作为 Rust 开发 IDE,因为它有非常强大的 Rust 插件支持。
2.3.1 安装 VS Code
2.3.2 安装 Rust 相关插件
打开 VS Code,点击左侧的插件图标(Extensions),搜索并安装以下插件:
- Rust Analyzer:由 Rust 官方团队主导开发,提供代码补全、语法检查、定义跳转、重构等核心功能
- CodeLLDB:用于 Rust 程序的调试
- Cargo:Cargo 命令的集成支持
- Even Better TOML:用于格式化 Cargo.toml 等 TOML 配置文件
三、第一个 Rust 项目:从 Hello, World!到可发布的 CLI 工具
3.1 使用 Cargo 创建标准项目
- 打开终端(或 VS Code 的终端)
- 进入你想存放项目的目录,比如
~/projects
- 进入项目目录:
3.2 项目目录结构解析
hello_rust_cli/
├── Cargo.lock # 项目依赖的精确版本锁定文件(自动生成,不要手动修改)
├── Cargo.toml # 项目配置文件(手动编辑)
└── src/
└── main.rs # 主源码文件(入口函数所在位置)
3.2.1 Cargo.toml 内容解析
[package]
name = "hello_rust_cli"
version = "0.1.0"
edition = "2021"
[dependencies]
3.2.2 src/main.rs 内容解析
fn main() {
println!("Hello, Rust World!");
}
fn main():Rust 程序的入口函数,Rust 会自动执行这个函数
println!():Rust 的宏(不是函数,注意后面的感叹号),用于向控制台输出内容
3.3 编译、运行、测试项目
3.3.1 编译项目
cargo build
cargo build --release
✅ 成功标志:编译完成后,会在 target/debug/ 或 target/release/ 目录下生成可执行文件。
3.3.2 运行项目
cargo run
cargo run --release
✅ 成功标志:输出 Hello, Rust World!。
3.3.3 测试项目
Rust 的测试功能非常强大,我们可以在 src/main.rs 中添加测试代码,也可以创建专门的测试文件。
⌨️ 测试代码示例:
在 src/main.rs 的末尾添加以下代码:
#[cfg(test)]
mod tests {
#[test]
fn test_hello_world() {
assert_eq!(1 + 1, 2);
}
}
✅ 成功标志:显示 test tests::test_hello_world ... ok。
3.4 扩展项目:添加命令行参数支持
现在,我们要将 Hello, Rust! 扩展为一个支持命令行参数的 CLI 工具,比如:
use clap::Parser;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
#[arg(short, long)]
name: String,
}
fn main() {
let args = Args::parse();
println!("Hello, {}!", args.name);
}
添加依赖:我们需要使用 clap 库来处理命令行参数
cargo add clap --features derive
3.5 调试项目
我们可以使用 VS Code 的 CodeLLDB 插件来调试 Rust 程序。
⌨️ 操作步骤:
- 在 VS Code 中打开项目
- 在 src/main.rs 的
println!() 一行设置断点(点击行号左侧的空白处)
- 点击左侧的运行图标(Run and Debug)
- 点击'创建 launch.json 文件',选择'LLDB: Launch'
- 点击'运行'按钮
- 程序会在断点处停止,我们可以查看变量值、调用栈等信息
{
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/target/debug/hello_rust_cli",
"args": ["--name", "张三"],
"cwd": "${workspaceFolder}",
"preLaunchTask": "cargo build"
}
]
}
3.6 发布项目
我们可以使用 Cargo 将项目发布到 crates.io 上,供其他开发者使用。
⚠️ 注意:发布项目之前,你需要先在 crates.io 上注册账号,并配置 API 密钥。
⌨️ 操作步骤:
✅ 成功标志:显示 Updating crates.io index 和 Published hello_rust_cli v0.1.0。
# hello_rust_cli
一个简单的 Hello, Rust! CLI 工具。
## 安装
```bash
cargo install hello_rust_cli
使用
hello_rust_cli --name "张三"
许可证
修改 Cargo.toml 文件:
添加作者、描述、仓库地址等信息:
```toml
[package]
name = "hello_rust_cli"
version = "0.1.0"
edition = "2021"
authors = ["你的名字 <你的邮箱>"]
description = "一个简单的 Hello, Rust! CLI 工具"
repository = "https://github.com/你的用户名/hello_rust_cli"
readme = "README.md"
license = "MIT"
[dependencies]
clap = { version = "4.5.4", features = ["derive"] }
然后输入你在 crates.io 上获得的 API 密钥。
四、Rust 新手常见陷阱与避坑指南
4.1 混淆变量的可变性与不可变性
⚠️ 陷阱:在 Rust 中,变量默认是不可变的(immutable),如果你尝试修改一个不可变变量,会导致编译错误。
⌨️ 错误示例:
fn main() {
let x = 5;
x = 6;
}
✅ 避坑方法:如果你需要修改一个变量,必须在声明时添加 mut 关键字:
fn main() {
let mut x = 5;
x = 6;
println!("x = {}", x);
}
4.2 忘记处理 Result 类型
⚠️ 陷阱:Rust 中的很多函数会返回 Result 类型,它表示操作成功或失败。如果你忘记处理 Result 类型,会导致编译错误。
⌨️ 错误示例:
use std::fs::File;
fn main() {
let file = File::open("test.txt");
}
✅ 避坑方法:有三种方法处理 Result 类型:
use std::fs::File;
use std::io;
fn read_file() -> io::Result<()> {
let _file = File::open("test.txt")?;
Ok(())
}
fn main() {
if let Err(e) = read_file() {
println!("文件操作失败:{}", e);
}
}
use std::fs::File;
fn main() {
if let Ok(f) = File::open("test.txt") {
println!("文件打开成功");
} else {
println!("文件打开失败");
}
}
use std::fs::File;
use std::io::ErrorKind;
fn main() {
let file = File::open("test.txt");
match file {
Ok(f) => println!("文件打开成功"),
Err(e) => match e.kind() {
ErrorKind::NotFound => println!("文件不存在"),
_ => println!("文件打开失败:{}", e),
},
}
}
4.3 混淆引用与所有权
⚠️ 陷阱:Rust 的所有权系统是它最核心的内存安全机制,也是最容易让新手困惑的地方。简单来说,每个值都有且仅有一个所有者,当所有者离开作用域时,值会被自动释放。
⌨️ 错误示例:
fn main() {
let s = String::from("hello");
takes_ownership(s);
println!("{}", s);
}
fn takes_ownership(s: String) {
println!("{}", s);
}
✅ 避坑方法:如果我们不想转移所有权,可以使用引用(reference):
fn main() {
let s = String::from("hello");
borrows_ownership(&s);
println!("{}", s);
}
fn borrows_ownership(s: &String) {
println!("{}", s);
}
4.4 忘记处理生命周期
⚠️ 陷阱:Rust 的生命周期系统用于确保引用的有效性,防止出现悬垂引用。如果我们忘记处理生命周期,会导致编译错误。
⌨️ 错误示例:
fn main() {
let r;
{
let x = 5;
r = &x;
}
println!("{}", r);
}
✅ 避坑方法:确保引用的生命周期不超过所有者的生命周期:
fn main() {
let x = 5;
let r = &x;
println!("{}", r);
}
五、总结与展望
5.1 总结
✅ 完成了 Rust 开发环境的完整搭建(Windows/macOS/Linux),配置了国内镜像源加速依赖下载
✅ 理解了 Cargo 作为 Rust 标准构建系统和包管理器的核心功能
✅ 成功创建了第一个 Rust 项目 Hello, Rust!,并将其扩展为支持命令行参数的 CLI 工具
✅ 掌握了 Rust 程序的编译、运行、测试、调试、发布流程
✅ 了解了 Rust 新手常见的陷阱与避坑方法
5.2 展望
下一篇文章,我们将深入学习 Rust 的基本数据类型和变量系统,包括:
- 标量类型(整数、浮点数、布尔值、字符)
- 复合类型(元组、数组、切片)
- 字符串类型(String 和&str)
- 变量的作用域和 shadowing(变量隐藏)
- 类型转换
通过学习这些内容,我们将能够编写更复杂的 Rust 程序。
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online