2018 版的工具

2018年12月17日 · 开发工具团队

工具是使编程语言实用且高效的重要组成部分。Rust 一直有一些很棒的工具(特别是 Cargo 作为一流的包管理器和构建工具享有盛誉),并且 2018 版包含了更多工具,我们希望这些工具能进一步改善 Rust 用户的使用体验。

在这篇博客文章中,我将介绍 Clippy 和 Rustfmt 这两个已经存在几年,现在稳定且可以普遍使用的工具。我还会介绍 IDE 支持 - 这是许多用户的关键工作流程,现在得到了更好的支持。我将首先讨论 Rustfix,这是一个对我们的版本迁移计划至关重要的新工具。

Rustfix

Rustfix 是一个用于自动更改 Rust 代码的工具。它是我们 2018 版迁移故事的关键部分,使从 2015 版过渡到 2018 版更加容易,并且在许多情况下完全自动化。这至关重要,因为如果没有这样的工具,我们在用户可接受的重大更改类型方面会受到更大的限制。

一个简单的例子

trait Foo {
    fn foo(&self, i32);
}

以上代码在 Rust 2015 中是合法的,但在 Rust 2018 中不合法(方法参数必须显式声明)。Rustfix 将以上代码更改为

trait Foo {
    fn foo(&self, _: i32);
}

有关如何使用 Rustfix 的详细信息,请参阅这些说明。要将您的代码从 2015 版过渡到 2018 版,请运行 cargo fix --edition

Rustfix 可以做很多事情,但它并不完美。当它无法修复您的代码时,它会发出警告,通知您需要手动修复。我们正在继续努力改进。

Rustfix 的工作原理是自动应用来自编译器的建议。当我们添加或改进编译器修复错误或警告的建议时,Rustfix 也会随之改进。我们在 IDE 中使用相同的信息来提供快速修复(例如自动添加导入)。

感谢 Pascal Hertleif (killercup)、Oliver Scherer (oli-obk)、Alex Crichton、Zack Davis 和 Eric Huss 开发了 Rustfix 和它使用的编译器 lints。

Clippy

Clippy 是 Rust 的一个 linter。它有许多(目前有 290 个!)lints,可以帮助改进您的程序的正确性、性能和风格。每个 lint 都可以打开或关闭 (allow),并配置为错误 (deny) 或警告 (warn)。

一个例子:iter_next_loop lint 检查您是否因在 next 的结果上迭代而不是在您调用 next 的对象上迭代而犯了错误(在将 while let 循环更改为 for 循环时,这是一个很容易犯的错误)。

for x in y.next() {
    // ...
}

会给出错误

error: you are iterating over `Iterator::next()` which is an Option; this will compile but is probably not what you want
 --> src/main.rs:4:14
  |
4 |     for x in y.next() {
  |              ^^^^^^^^
  |
  = note: #[deny(clippy::iter_next_loop)] on by default
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_next_loop

Clippy 通过扩展 Rust 编译器来工作。编译器支持一些内置的 lints,Clippy 使用相同的机制,但具有更多的 lints。这意味着 Clippy 的错误/警告格式应该是熟悉的,您应该能够在 IDE 中(或使用 Rustfix)应用 Clippy 的建议,并且 lints 是可靠和准确的。

在 Rust 1.31 和 2018 版中,Clippy 在稳定的 Rust 上可用,并具有向后兼容性保证(如果它有版本号,它将是 1.0)。Clippy 具有与 rustc 相同的稳定性保证:可以添加新的 lints,并且可以修改 lints 以添加更多功能,但是永远不会删除 lints(仅会弃用)。这意味着使用 Clippy 编译的代码将继续使用 Clippy 编译(前提是没有通过 deny 将任何 lints 设置为错误),但可能会抛出新的警告。

可以使用 rustup component add clippy 安装 Clippy,然后使用 cargo clippy 使用它。有关更多信息,包括如何在 CI 中运行它,请参阅仓库自述文件

感谢 Clippy 团队(Pascal Hertleif (killercup)、Oliver Scherer (oli-obk)、Manish Goregaokar (manishearth) 和 Andre Bogus (llogiq))!

Rustfmt

Rustfmt 是一个用于格式化源代码的工具。它获取任意杂乱的代码,并将其转换为整洁、美观的代码。

自动格式化可以节省您的时间和精力。您不必在编码时担心样式。如果在 CI 中使用 Rustfmt (cargo fmt --check),则无需在代码审查中担心代码样式。通过使用标准样式,您可以使您的项目对新的贡献者感到更加熟悉,并避免有关代码样式的争论。Rust 的标准代码样式是 Rustfmt 的默认样式,但如果必须,您可以广泛自定义 Rustfmt。

Rustfmt 1.0 是 2018 版发行版的一部分。它应该可以在所有代码上工作,并且在 2.0 版本发布之前将向后兼容。向后兼容意味着如果您的代码已格式化(即,排除阻止任何格式化或无法编译的代码的错误),它将始终以相同的方式格式化。此保证仅适用于您使用默认格式化选项的情况。

Rustfmt 尚未完成。格式化并不完美,特别是我们不触及注释和字符串文字,并且我们在宏定义和一些宏使用方面受到相当大的限制。我们很可能会在此处改进格式化,但在 2.0 版本发布之前,您需要选择加入这些更改。我们正在计划发布 2.0 版本。与 Rust 本身不同,我们认为发布 Rustfmt 的重大版本是一个好主意,并预计这将在 2019 年末发生。

要安装 Rustfmt,请使用 rustup component add rustfmt。要格式化您的项目,请使用 cargo fmt。您还可以使用 rustfmt 格式化单个文件(但请注意,默认情况下,rustfmt 会格式化嵌套模块)。您还可以在编辑器或 IDE 中使用 RLS 使用 Rustfmt(请参阅下文;无需为此安装 rustfmt,它作为 RLS 的一部分提供)。我们建议将您的编辑器配置为在保存时运行 rustfmt。在您键入时完全不必考虑格式化是一种令人愉快的改变。

感谢 Seiichi Uchida (topecongiro)、Marcus Klaas 和所有 Rustfmt 的贡献者!

IDE 支持

对于许多用户来说,他们的 IDE 是最重要的工具。Rust IDE 支持已经开发了一段时间,并且是一项需求很高的功能。现在,许多 IDE 和编辑器都支持 Rust:IntelliJVisual Studio CodeAtomSublime TextEclipse(以及更多……)。请按照每个链接获取安装说明。

编辑器支持以两种不同的方式提供:IntelliJ 使用自己的编译器,其他编辑器通过 Rust 语言服务器 (RLS) 使用 Rust 编译器。两种方法都提供了良好但并不完美的 IDE 体验。您可能应该根据自己喜欢的编辑器进行选择(尽管如果您的项目不使用 Cargo,则您将无法使用 RLS)。

所有这些编辑器都支持标准的 IDE 功能,包括“转到定义”、“查找所有引用”、代码完成、重命名和重新格式化。

RLS 由 Rust 开发工具团队开发,旨在为尽可能多的 IDE 和编辑器提供 Rust 支持。它直接使用 Cargo 和 Rust 编译器来提供有关程序的准确信息。由于性能限制,代码完成尚未使用编译器提供支持,因此可能比其他功能更容易出错。

感谢 IDE 和编辑器团队为 RLS 和各种 IDE 和扩展(alexheretic、autozimu、jasonwilliams、LucasBullen、matklad、vlad20012、Xanewok)所做的工作,感谢 Jonathan Turner 帮助启动 RLS,感谢 phildawes、kngwyu、jwilm 和其他 Racer 贡献者为 Racer(RLS 的代码完成组件)所做的工作!

未来

我们还没有完成!我们认为在未来一年左右的时间里,我们可以在工具领域做更多的事情。

我们一直在改进 LLDB 和 GDB 中的 Rust 调试支持,并且还有更多工作正在进行中。我们正在试验使用 Rustup 分发我们自己的版本,并使从 IDE 进行调试更加容易和强大。

我们希望使 RLS 更快、更稳定、更准确;包括使用编译器进行代码完成。

我们希望使 Cargo 更强大:Cargo 将处理编译后的二进制文件以及源代码,这将使构建和安装 crates 更快。我们将支持与更多构建系统的更好集成(这反过来将使 RLS 可以与更多项目一起使用)。我们将添加用于添加和升级依赖项的命令,并帮助进行安全审计。

Rustdoc 将改进其源代码视图(由 RLS 提供支持)以及不同 crates 的文档之间的链接。

总是有很多有趣的事情要做。如果您想帮助我们,请在 GitHub 或 Discord 上与我们聊天。