Rust 语言入门:从环境搭建到发布第一个 CLI 工具
Rust 语言入门指南涵盖核心价值分析、多平台环境搭建及国内镜像源配置。通过 Cargo 构建首个 CLI 工具,演示了编译、运行、测试、调试及发布至 crates.io 的全流程。重点解析了变量可变性、Result 类型处理、所有权机制及生命周期管理等新手易错点,并提供具体代码示例与避坑方案,帮助开发者快速掌握 Rust 基础开发技能。

Rust 语言入门指南涵盖核心价值分析、多平台环境搭建及国内镜像源配置。通过 Cargo 构建首个 CLI 工具,演示了编译、运行、测试、调试及发布至 crates.io 的全流程。重点解析了变量可变性、Result 类型处理、所有权机制及生命周期管理等新手易错点,并提供具体代码示例与避坑方案,帮助开发者快速掌握 Rust 基础开发技能。

作为接触过大量刚入门或想转 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 倍。
💡 rustup 是 Rust 官方唯一推荐的安装工具,它可以:
⚠️ 注意:Windows 用户需要先安装 Visual Studio Build Tools(C++ 编译器),否则无法编译 Rust 程序。
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) 类似的版本信息
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
验证安装:
rustc --version
cargo --version
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
⚠️ 警告:由于网络原因,直接从 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"
# 如果 git 协议访问慢,可以尝试 https 协议
# registry = "https://mirrors.ustc.edu.cn/crates.io-index"
推荐使用VS Code作为 Rust 开发 IDE,因为它有非常强大的 Rust 插件支持。
访问 VS Code 官方网站:https://code.visualstudio.com/,下载并安装对应系统的版本。
打开 VS Code,点击左侧的插件图标(Extensions),搜索并安装以下插件:
⌨️ 操作步骤:
~/projectscd hello_rust_cli
cargo new hello_rust_cli
📊 项目目录结构:
hello_rust_cli/
├── Cargo.lock # 项目依赖的精确版本锁定文件(自动生成,不要手动修改)
├── Cargo.toml # 项目配置文件(手动编辑)
└── src/
└── main.rs # 主源码文件(入口函数所在位置)
[package]
name = "hello_rust_cli" # 项目名称(必须符合 Rust 的命名规范:小写字母 + 下划线)
version = "0.1.0" # 项目版本(遵循语义化版本控制:MAJOR.MINOR.PATCH)
edition = "2021" # Rust 的版本(目前最新稳定版是 2021)
[dependencies] # 项目依赖的库(可以手动添加,也可以用 cargo add 命令)
// src/main.rs - Hello, Rust! 的标准写法
fn main() {
println!("Hello, Rust World!");
}
fn main():Rust 程序的入口函数,Rust 会自动执行这个函数println!():Rust 的宏(不是函数,注意后面的感叹号),用于向控制台输出内容cargo build # 编译为 debug 版本(默认,用于开发和调试)
cargo build --release # 编译为 release 版本(优化后的,用于生产环境)
✅ 成功标志:编译完成后,会在 target/debug/ 或 target/release/ 目录下生成可执行文件。
cargo run # 同时完成编译和运行 debug 版本
cargo run --release # 同时完成编译和运行 release 版本
✅ 成功标志:输出 Hello, Rust World!。
Rust 的测试功能非常强大,我们可以在 src/main.rs 中添加测试代码,也可以创建专门的测试文件。
⌨️ 测试代码示例:
在 src/main.rs 的末尾添加以下代码:
#[cfg(test)]
mod tests {
#[test]
fn test_hello_world() {
assert_eq!(1 + 1, 2); // 简单的测试断言
}
}
运行测试:
cargo test # 运行所有测试
✅ 成功标志:显示 test tests::test_hello_world ... ok。
现在,我们要将 Hello, Rust! 扩展为一个支持命令行参数的 CLI 工具,比如:
cargo run -- --name "张三"
输出:Hello, 张三!
⌨️ 操作步骤:
修改 src/main.rs:
use clap::Parser;
/// 一个简单的 Hello, Rust! CLI 工具
#[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
运行扩展后的项目:
cargo run -- --name "张三"
✅ 成功标志:输出 Hello, 张三!。
我们可以使用 VS Code 的 CodeLLDB 插件来调试 Rust 程序。
⌨️ 操作步骤:
println!() 一行设置断点(点击行号左侧的空白处)修改 launch.json 文件:
{
"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"
}
]
}
我们可以使用 Cargo 将项目发布到 crates.io 上,供其他开发者使用。
⚠️ 注意:发布项目之前,你需要先在 crates.io 上注册账号,并配置 API 密钥。
⌨️ 操作步骤:
发布项目:
cargo publish
✅ 成功标志:显示 Updating crates.io index 和 Published hello_rust_cli v0.1.0。
创建 README.md 文件:
# hello_rust_cli
一个简单的 Hello, Rust! CLI 工具。
## 安装
```bash
cargo install hello_rust_cli
hello_rust_cli --name "张三"
输出:Hello, 张三!
MIT
修改 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"] }
配置 API 密钥:
在终端中输入以下命令:
cargo login
然后输入你在 crates.io 上获得的 API 密钥。
⚠️ 陷阱:在 Rust 中,变量默认是不可变的(immutable),如果你尝试修改一个不可变变量,会导致编译错误。
⌨️ 错误示例:
fn main() {
let x = 5;
x = 6; // 编译错误:x is declared as immutable
}
✅ 避坑方法:如果你需要修改一个变量,必须在声明时添加 mut 关键字:
fn main() {
let mut x = 5;
x = 6;
println!("x = {}", x); // 输出 x = 6
}
⚠️ 陷阱:Rust 中的很多函数会返回 Result 类型,它表示操作成功或失败。如果你忘记处理 Result 类型,会导致编译错误。
⌨️ 错误示例:
use std::fs::File;
fn main() {
let file = File::open("test.txt"); // 返回 Result<File, io::Error>
}
✅ 避坑方法:有三种方法处理 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);
}
}
使用 if let 表达式:
use std::fs::File;
fn main() {
if let Ok(f) = File::open("test.txt") {
println!("文件打开成功");
} else {
println!("文件打开失败");
}
}
使用 match 表达式:
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),
},
}
}
⚠️ 陷阱:Rust 的所有权系统是它最核心的内存安全机制,也是最容易让新手困惑的地方。简单来说,每个值都有且仅有一个所有者,当所有者离开作用域时,值会被自动释放。
⌨️ 错误示例:
fn main() {
let s = String::from("hello");
takes_ownership(s); // s 的所有权转移到 takes_ownership 函数
println!("{}", s); // 编译错误:s 已经没有所有权了
}
fn takes_ownership(s: String) {
println!("{}", s);
}
✅ 避坑方法:如果我们不想转移所有权,可以使用引用(reference):
fn main() {
let s = String::from("hello");
borrows_ownership(&s); // 传递 s 的引用
println!("{}", s); // 编译成功:s 的所有权还在
}
fn borrows_ownership(s: &String) {
println!("{}", s);
}
⚠️ 陷阱:Rust 的生命周期系统用于确保引用的有效性,防止出现悬垂引用。如果我们忘记处理生命周期,会导致编译错误。
⌨️ 错误示例:
fn main() {
let r;
{
let x = 5;
r = &x; // 编译错误:x 的生命周期比 r 短
}
println!("{}", r);
}
✅ 避坑方法:确保引用的生命周期不超过所有者的生命周期:
fn main() {
let x = 5;
let r = &x;
println!("{}", r);
}
✅ 完成了 Rust 开发环境的完整搭建(Windows/macOS/Linux),配置了国内镜像源加速依赖下载
✅ 理解了 Cargo 作为 Rust 标准构建系统和包管理器的核心功能
✅ 成功创建了第一个 Rust 项目 Hello, Rust!,并将其扩展为支持命令行参数的 CLI 工具
✅ 掌握了 Rust 程序的编译、运行、测试、调试、发布流程
✅ 了解了 Rust 新手常见的陷阱与避坑方法
下一篇文章,我们将深入学习 Rust 的基本数据类型和变量系统,包括:
通过学习这些内容,我们将能够编写更复杂的 Rust 程序。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online