#rustfmt #formatting #issue #style #find #fix #format

bin+lib rustfmt-nightly

用于查找和修复 Rust 格式化问题的工具

94 个版本 (35 个稳定版)

1.4.21 2020 年 9 月 6 日
1.4.19 2020 年 7 月 21 日
1.4.18 2020 年 6 月 13 日
1.4.13 2020 年 3 月 31 日
0.2.1 2017 年 7 月 25 日

开发工具 中排名 #672

Download history 154/week @ 2024-03-14 74/week @ 2024-03-21 271/week @ 2024-03-28 121/week @ 2024-04-04 57/week @ 2024-04-11 67/week @ 2024-04-18 64/week @ 2024-04-25 59/week @ 2024-05-02 81/week @ 2024-05-09 83/week @ 2024-05-16 60/week @ 2024-05-23 66/week @ 2024-05-30 51/week @ 2024-06-06 52/week @ 2024-06-13 57/week @ 2024-06-20 23/week @ 2024-06-27

每月下载量 190
12crate(10 个直接)中使用

Apache-2.0/MIT

1MB
25K SLoC

rustfmt 构建状态 构建状态 crates.io Travis 配置状态

一个用于根据风格指南格式化 Rust 代码的工具。

如果您想帮忙(您应该这么做,这是一个有趣的项目!),请参阅 Contributing.md 和我们的 Code of Conduct

您可以在 Travis CI 构建中使用 rustfmt。我们提供了一个最小的 Travis CI 配置(见 此处),并使用另一个仓库验证其状态。该仓库构建的状态由上面的“travis example”徽章报告。

快速入门

您可以使用 Rust 1.24 及以上版本运行 rustfmt

在稳定工具链上

安装

rustup component add rustfmt

在当前工作目录中的 cargo 项目上运行

cargo fmt

在夜间工具链上

要获取最新和最好的 rustfmt,需要夜间工具链。

安装

rustup component add rustfmt --toolchain nightly

在当前工作目录中的 cargo 项目上运行

cargo +nightly fmt

局限性

Rustfmt 尝试尽可能多地处理 Rust 代码,有时,代码甚至不需要编译!随着我们接近 1.0 版本的发布,我们也在努力限制不稳定区域的数量;特别是,在 1.0 之后,随着 Rustfmt 的改进,大多数代码的格式应该不会改变。然而,有些事情 Rustfmt 做不到或者做得不好(因此格式可能会在 1.0 之后有显著变化)。我们希望随着时间的推移减少限制列表。

以下列表列举了 Rustfmt 不工作或稳定性保证不适用(我们在这两者之间没有区别,因为在未来 Rustfmt 可能会在当前无法工作的代码上工作)的区域。

  • 程序中任何部分无法解析的程序(解析是编译的早期阶段,在 Rust 中包括宏展开)。
  • 宏声明和用法(当前状态:一些宏声明和用法已经进行了格式化)。
  • 注释,包括任何带有注释 '内部' 的 AST 节点(Rustfmt 目前不尝试格式化注释,它格式化带有注释的代码,但这种格式化可能在将来改变)。
  • 注释中的代码块中的 Rust 代码。
  • 程序的任何片段(即,稳定性保证仅适用于整个程序,即使今天程序片段可以格式化)。
  • 包含非 ASCII Unicode 字符的代码(我们相信 Rustfmt 在这里大多可以工作,但我们没有足够的测试覆盖率或经验来确保 100% 确定)。
  • Rustfmt 的错误(像任何软件一样,Rustfmt 有错误,我们不认为错误修复会破坏我们的稳定性保证)。

安装

rustup component add rustfmt

从源代码安装

要从源代码安装(需要 nightly),首先检出您想要安装的标签或分支,然后执行

cargo install --path .

这将 rustfmt 安装在您的 ~/.cargo/bin。请确保将 ~/.cargo/bin 目录添加到您的 PATH 变量中。

运行

如果您使用过 cargo install,则可以通过简单地键入 rustfmt filename 来运行 Rustfmt。这将在给定的文件上运行 rustfmt,如果该文件包含行外模块,则我们也将重新格式化它们。因此,要在一个整个模块或crate上运行,只需在根文件(通常是 mod.rs 或 lib.rs)上运行即可。Rustfmt 还可以从 stdin 读取数据。或者,您可以使用 cargo fmt 来格式化您的 crate 的所有二进制和库目标。

您可以通过运行 rustfmt --help 获取有关可用参数的信息。

当使用 --check 运行时,如果 Rustfmt 不会对输入进行任何格式化更改,则 Rustfmt 将以 0 退出,如果 Rustfmt 将进行更改,则以 1 退出。在其他模式下,如果格式化过程中出现某些错误(例如解析或内部错误),Rustfmt 将以 1 退出,如果格式化完成后没有错误(无论是否进行了更改),则以 0 退出。

从您的编辑器运行 Rustfmt

在 CI 服务器上检查样式

为了保持代码库格式的一致性,当拉取请求中包含未格式化的代码时,使 CI 构建失败可能很有帮助。使用--check指令告诉 rustfmt 如果输入未正确格式化,则退出并返回错误代码。它还会打印出找到的差异。(较旧版本的 Rustfmt 不支持--check,请使用--write-mode diff)。

一个基本的 Travis 配置可能如下所示(需要 Rust 1.24.0 或更高版本)

language: rust
before_script:
- rustup component add rustfmt
script:
- cargo build
- cargo test
- cargo fmt --all -- --check

有关更多信息,请参阅这篇博客文章

如何构建和测试

使用cargo build进行构建。

使用cargo test运行所有测试。

在构建后运行 rustfmt,使用cargo run --bin rustfmt -- filename。请参阅上述关于运行 rustfmt 的说明。

配置 Rustfmt

Rustfmt 被设计为非常可配置。您可以创建一个名为 rustfmt.toml.rustfmt.toml 的 TOML 文件,将其放置在项目或任何其他父目录中,然后它将应用该文件中的选项。有关可用选项,请参阅rustfmt -h,或如果您更喜欢查看视觉样式预览,请访问GitHub 页面

默认情况下,Rustfmt 使用符合通过Rust 风格指南正式化的风格,该指南通过风格 RFC 流程制定。

配置选项要么是稳定的,要么是不稳定的。稳定选项始终可以使用,而不稳定的选项仅在夜间工具链上可用,并且需要选择。有关详细信息,请参阅GitHub 页面

Rust 的版本

Rustfmt 能够通过读取执行通过 Cargo 的格式化工具 cargo fmt 时的 Cargo.toml 文件来识别使用的版本。否则,需要在 rustfmt.toml 中指定版本,例如使用 edition = "2018"

提示

  • 对于您不希望 rustfmt 修改的内容,请使用#[rustfmt::skip]

  • 要防止 rustfmt 格式化宏或属性,请使用#[rustfmt::skip::macros(target_macro_name)]#[rustfmt::skip::attributes(target_attribute_name)]

    示例

    #![rustfmt::skip::attributes(custom_attribute)]   
    
    #[custom_attribute(formatting , here , should , be , Skipped)]
    #[rustfmt::skip::macros(html)]
    fn main() {
        let macro_result1 = html! { <div>
    Hello</div>
        }.to_string();
    
  • 在运行rustfmt时,将名为rustfmt.toml.rustfmt.toml的文件放置在目标文件目录或其父目录中,以覆盖rustfmt的默认设置。您可以使用rustfmt --print-config default rustfmt.toml生成包含默认配置的文件,并根据需要自定义。

  • 编译成功后,可以在目标目录中找到rustfmt可执行文件。

  • 如果您在编译Rustfmt(或尝试安装时遇到编译错误)时遇到问题,请确保您已安装最新版本的Rust。

  • 您可以使用--emit标志更改rustfmt输出更改的方式

    示例

    cargo fmt -- --emit files
    

    选项

    标志 描述 夜间版本
    文件 覆盖输出到文件
    stdout 将输出写入stdout
    覆盖率 显示输入文件处理了多少
    checkstyle 以checkstyle格式输出
    json 以json格式输出差异

许可证

Rustfmt根据MIT许可证和Apache许可证(版本2.0)的条款分发。

有关详细信息,请参阅LICENSE-APACHELICENSE-MIT

依赖关系

~18–31MB
~498K SLoC