在 Ubuntu 上使用 Rust,常见问题并不是“能不能装上”,而是装完之后工具链是否好维护、项目结构是否规范、后续升级会不会打乱环境。下面按开发者最常遇到的几个环节展开,从安装方式到依赖、测试、优化与自动化,把一套更适合长期使用的实践串起来。读完后,你可以判断哪些步骤是必做项,哪些属于按项目阶段逐步补齐的增强项。
为什么在 Ubuntu 上优先用 rustup 安装 Rust
在 Ubuntu 上部署 Rust 开发环境,优先选择 rustup,而不是直接用 apt 安装,原因主要有两点:一是它由 Rust 官方维护,二是它能统一管理 stable、beta、nightly 等不同工具链,并处理配套组件。

一套常见安装流程如下:
- 更新系统依赖:
sudo apt update && sudo apt upgrade -y - 安装基础编译工具:
sudo apt install curl build-essential gcc make -y - 执行 rustup 安装脚本:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - 激活环境:
source $HOME/.cargo/env - 验证安装结果:
rustc --version和cargo --version
如果终端能正常输出版本号,说明编译器和包管理工具已经可用。对于需要同时维护多个项目、或者未来可能切换 nightly 功能的场景,rustup 的后续维护成本也明显低于系统包方式。
环境加速与常用组件怎么配
Rust 装好后,真正影响日常体验的通常是下载速度、编辑器提示和基础质量工具是否齐全。Ubuntu 上这一部分建议尽早补齐。
下载慢时先配镜像
如果默认源下载较慢,可以通过环境变量切换到国内镜像,例如:
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
这两项既可以临时设置,也可以写入 ~/.bashrc,用于后续更新工具链。
把 clippy 和 rustfmt 作为基础组件安装
clippy 负责静态检查,rustfmt 负责格式统一,这两项基本可以视为 Rust 项目的默认配置:

rustup component add clippy
rustup component add rustfmt
它们能尽早发现未使用变量、风格不一致等问题,尤其适合多人协作。
编辑器尽量接入官方扩展
如果使用 VS Code,安装官方的“Rust”扩展通常就能获得语法高亮、补全和实时错误提示。对新项目来说,这一步能明显减少低级错误和来回查文档的时间。

项目结构为什么要尽量遵循 Cargo 规范
Rust 生态默认围绕 Cargo 运转,因此项目结构最好跟随 Cargo 的约定,而不是自己发明目录规则。创建项目时可以直接使用:
cargo new my_project --bin # 创建可执行程序项目(默认)
# 或
cargo new my_lib --lib # 创建库项目
生成出来的典型结构如下:
my_project/
├── Cargo.toml # 项目配置文件(名称、版本、依赖、构建选项)
├── src/
│ ├── main.rs # 主入口文件(可执行程序的起点)
│ └── lib.rs # 库入口文件(库项目的起点)
└── target/ # 编译输出目录(自动生成,不用手动改)
Cargo.toml 是项目的核心元数据文件,通常至少要明确名称、版本、Edition 和依赖。例如:
[package]
name = "my_project"
version = "0.1.0"
edition = "2021" # 使用Rust 2021 Edition(最新稳定特性)
[dependencies]
serde = { version = "1.0", features = ["derive"] } # JSON序列化库
tokio = { version = "1.0", features = ["full"] } # 异步运行时
代码组织上,建议尽早按职责拆模块,例如把工具函数放到 utils.rs,把配置读取放到 config.rs,再通过 src/lib.rs 或 src/main.rs 对外暴露。这样做的价值不只是“整洁”,更在于后面补测试、拆库或重构时更容易维护。
依赖管理与代码质量如何一起落地
Cargo 的强项不仅是构建,还包括依赖解析、版本锁定和常用质量命令的统一入口。实际项目里,这几件事最好放在一起看。
依赖尽量通过 Cargo.toml 统一声明
添加依赖时,直接写入 [dependencies],然后执行 cargo build,Cargo 会自动下载、编译并缓存到 ~/.cargo/registry。例如:
- 依赖声明:
serde = "1.0" - 构建下载:
cargo build - 更新锁定文件:
cargo update - 只更新单个依赖:
cargo update serde
像 serde = "1.0" 这样的语义化版本写法,表示兼容 1.0 系列可用版本,通常能在灵活升级和控制兼容性之间取得平衡。
格式化和静态检查建议变成日常命令
代码风格和潜在错误最好不要等到评审阶段才发现。最常用的两个命令是:
cargo fmt:自动格式化代码cargo clippy:检查潜在问题和不推荐写法
如果团队对质量要求更严格,还可以在 CI 中配合 cargo clippy -- -D warnings,把警告直接提升为失败条件。
测试至少覆盖单元测试和集成测试
Rust 的测试支持是工具链内建能力,适合尽早使用。单元测试可以直接写在源码文件里:
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add() {
assert_eq!(add(2, 2), 4); // 测试add函数
}
}
如果要验证模块之间的交互,可以在 tests 目录下增加集成测试文件,例如 integration_test.rs。对于性能敏感逻辑,还可以引入 criterion = "0.4" 做基准测试:
use criterion::{black_box, criterion_group, criterion_main, Criterion};
fn fibonacci(n: u64) -> u64 {
match n {
0 => 1,
1 => 1,
_ => fibonacci(n-1) + fibonacci(n-2),
}
}
fn bench_fibonacci(c: &mut Criterion) {
c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));
}
criterion_group!(benches, bench_fibonacci);
criterion_main!(benches);
执行 cargo bench 后,就可以对关键路径做更具体的性能观察,而不是只凭体感判断。
什么时候该做性能优化和持续集成
Rust 本身已经有不错的性能基础,但在 Ubuntu 上做项目时,构建速度、运行效率和回归控制仍然值得单独处理。
先区分开发构建和发布构建
正式构建建议使用 cargo build --release。发布模式默认采用 opt-level=3,适合追求运行性能;如果更在意编译时间,也可以根据项目情况调整优化等级来平衡。
链接速度慢时可以考虑 mold
对于编译频繁的大项目,链接阶段可能成为等待瓶颈。Ubuntu 上可以安装 mold:
sudo apt install mold
export RUSTFLAGS="-C link-arg=-fuse-ld=mold"
原文给出的经验是,它相对默认 ld 可快 2-3 倍。是否值得启用,取决于你的构建规模和迭代频率。
性能热点再考虑并行和内存分配
如果程序已经定位到 CPU 或 IO 热点,再考虑更针对性的优化会更有效。例如:
- 使用
rayon = "1.8",把普通迭代替换为par_iter(),提升多核利用率 - 减少不必要的
String分配,优先使用&str - 文件 IO 使用
BufReader/BufWriter,减少系统调用次数
这些优化更适合建立在测试和基准数据之后,而不是一开始就全面铺开。
用 GitHub Actions 把检查自动化
当项目开始多人协作,或者已经进入稳定迭代阶段,CI/CD 就应该尽早接入。一个基础的 GitHub Actions 工作流可以这样写:
name: Rust CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
run: rustup update && rustup default stable
- name: Run tests
run: cargo test
- name: Run clippy
run: cargo clippy -- -D warnings
- name: Build release
run: cargo build --release
这类流程的重点不只是“自动跑一遍命令”,而是把测试、静态检查和发布构建变成合并前的固定门槛,尽量把回归问题拦在主分支之外。







