rustfmt 是什么
rustfmt 按官方风格重排 Rust 代码,用来终结格式争议:换行位置、缩进、参数折行都不再需要人工讨论。它通过 rustfmt.toml 调整少量稳定选项,多模块项目可以用配置忽略子目录或按文件就地跳过,cargo fmt 负责批量应用。它只处理排版,代码质量类问题交给 Clippy。
基本信息
| 配置文件 | rustfmt.toml(放在仓库根目录,随代码评审) |
|---|---|
| 常用稳定项 | max_width、edition、use_small_heuristics |
| 应用方式 | cargo fmt --all 批量重排 |
| CI 检查 | cargo fmt --all -- --check,只检查不修改 |
| 忽略方式 | 配置项忽略目录,或按文件跳过格式化 |
典型使用场景
- 团队统一排版风格,评审只讨论逻辑不讨论换行
- CI 拦截未格式化的代码,避免风格随时间漂移
- 多人协作的模块在提交前批量重排,减少合并冲突
- 生成代码目录通过配置排除,不参与格式化
- 新人编辑器设置与团队不一致时,用命令兜底重排
配置与命令
配置与命令
# rustfmt.toml:只使用稳定选项,团队统一后写进仓库
max_width = 100
edition = "2021"
use_small_heuristics = "Default"
# 命令行
# cargo fmt --all 批量重排整个工作区
# cargo fmt --all -- --check CI 只检查,不通过即失败
# rustfmt --edition 2021 src/main.rs 单独格式化一个文件常用配置项
| 配置项 | 作用 | 建议 |
|---|---|---|
| max_width | 单行最大宽度,默认 100 | 团队统一后写进仓库 |
| edition | 解析代码使用的 Rust 版本 | 与项目工具链版本保持一致 |
| use_small_heuristics | 小幅结构的折行策略 | 统一取值,避免逐文件差异 |
| skip_children | 子目录不加载自己的配置 | 多模块仓库避免配置打架 |
| ignore | 排除指定目录或文件 | 生成代码、第三方代码可排除 |
CI 里固定用 cargo fmt --all -- --check:只检查不修改,未格式化的代码直接失败;本地则用不带 --check 的命令自动重排,改完再提交。
团队工具链版本不一致时格式化结果会有差异,diff 里出现大量与本次需求无关的改动;用工具链版本文件把 rustfmt 版本固定下来,能消除这类噪声。
不稳定选项(需要 nightly 工具链的配置项)会让结果随版本变化,跨机器甚至跨时间都可能不一致;确有需要时在配置文件里注明原因,并接受它随时可能调整。