🦀

Rust コーディング環境構築@VSCode

2022/03/09に公開

VSCode で Rust のコーディング環境を整えていく話です。

環境

  • OS
$ uname -a
Linux X260-arch 5.16.8-arch1-1 #1 SMP PREEMPT Tue, 08 Feb 2022 21:21:08 +0000 x86_64 GNU/Linux
$ cat /etc/os-release
NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
LOGO=archlinux-logo
  • Rust
$ rustup --version
rustup 1.24.3 (ce5817a94 2021-05-31)
$ cargo --version
cargo 1.58.0 (f01b232bc 2022-01-19)
$ rustc --version
rustc 1.58.1 (db9d1b20b 2022-01-20)
  • VSCode
$ code -v
1.64.2

Rust をインストールする

Rustup を使うのがデファクトスタンダードです。

https://www.rust-lang.org/tools/install

↓このコマンドを打てば終わり。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Windows だとちょっと面倒くさいです。WSL なら上記コマンドで OK。

VSCode をインストールする

これは各環境に応じて。

https://code.visualstudio.com/download

Arch Linux であれば、AUR のものが使えます。

$ yay -S visual-studio-code-bin

VSCode に rust-analyzer を入れる

rust-analyzer は今一番イケてる Rust の Language Server っぽいです。

インストール方法は公式ドキュメントが詳しいです。
VSCode 以外の方法も結構丁寧に書いてあります。

https://rust-analyzer.github.io/manual.html#installation

VSCode の場合、拡張機能を普通にインストールするだけで OK です。

https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer

注意

Note that the plugin may cause conflicts with the official Rust plugin. It is recommended to disable the Rust plugin when using the rust-analyzer extension.

本家もあるのですが、競合するかもしれないからそちらは無効化しておけ、とのこと。
どうせ使わないので最初からインストールしない、インストール済みの場合はアンインストールして良いかと思います。

その他入れておくと便利なツール

cargo edit

Cargo.toml を CLI で操作するツールです。最新版とかをよしなに取ってきてくれるので便利です。

https://github.com/killercup/cargo-edit

$ cargo install cargo-edit

cargo watch

プロジェクトの変更を検知して、起動コマンド等を自動的に実行しなおしてくれるやつです。

https://github.com/watchexec/cargo-watch

インストール:

$ cargo install cargo-watch

Web アプリなんかを開発しているとホットリロードしたくなりますよね。

例えば cargo run で実行しているアプリは、下記コマンドで起動しておくと、ホットリロードが効くようになります。

$ cargo watch -x run

Actix もこの方法を推奨しています。

Rustfmt

公式が提供しているフォーマッタです。

https://doc.rust-jp.rs/book-ja/appendix-04-useful-development-tools.html#rustfixでコードを修正する

インストール:

$ rustup component add rustfmt

設定項目一覧:

https://rust-lang.github.io/rustfmt

リンク先にもある通り、rustfmt.toml.rustfmt.toml を Cargo プロジェクトのルートに置いて、そこに好みの設定を書くのが良いです。

Clippy

Rust の静的解析ツールです。

https://doc.rust-jp.rs/book-ja/appendix-04-useful-development-tools.html#clippyでもっとlintを

インストール:

$ rustup component add clippy

検査内容は↓こちらに一覧化されています。

https://rust-lang.github.io/rust-clippy/master/

検査内容はコマンドライン引数で指定するのが良さそうです。

例えば、私は return を省略したくない人間なので needless_return を許容させています。
こんな感じで:

$ cargo clippy -- -A clippy::needless_return

注意

一応設定ファイルも使えるのですが、サポートされているものが少ないようです。

先の needless_return = trueclippy.toml で指定すると、↓このようにエラーになりました。

$ cargo clippy
(中略)
error: error reading Clippy's configuration file `/path/to/clippy.toml`: unknown field `needless_return`, expected one of `avoid-breaking-exported-api`, `msrv`, `blacklisted-names`, `cognitive-complexity-threshold`, `cyclomatic-complexity-threshold`, `doc-valid-idents`, `too-many-arguments-threshold`, `type-complexity-threshold`, `single-char-binding-names-threshold`, `too-large-for-stack`, `enum-variant-name-threshold`, `enum-variant-size-threshold`, `verbose-bit-mask-threshold`, `literal-representation-threshold`, `trivial-copy-size-limit`, `pass-by-value-size-limit`, `too-many-lines-threshold`, `array-size-threshold`, `vec-box-size-threshold`, `max-trait-bounds`, `max-struct-bools`,`max-fn-params-bools`, `warn-on-all-wildcard-imports`, `disallowed-methods`, `disallowed-types`, `unreadable-literal-lint-fractions`, `upper-case-acronyms-aggressive`, `cargo-ignore-publish`, `standard-macro-braces`, `enforced-import-renames`, `allowed-scripts`, `enable-raw-pointer-heuristic-for-send`, `third-party` at line 1 column 1 

VSCode の設定を書く

設定項目一覧:

https://rust-analyzer.github.io/manual.html#configuration

保存時に、Rustfmt によるフォーマットと Clippy による静的解析が走るようにしています。

{
    "[rust]": {
        "editor.formatOnSave": true
    },
    "rust-analyzer.checkOnSave": true,
    "rust-analyzer.check.command": "clippy",
    "rust-analyzer.check.extraArgs": ["--", "-A", "clippy::needless_return"]
}

デフォルトだとヒント表示がかなりうるさい(下図)ので、嫌な方は適宜消すと良いかもしれません。

ヒント系をオフにする設定はこんな感じです。

{
    "rust-analyzer.inlayHints.chainingHints": false,
    "rust-analyzer.inlayHints.parameterHints": false,
    "rust-analyzer.inlayHints.typeHints": false,
    "rust-analyzer.inlayHints.hideNamedConstructorHints": false
}

hideNamedConstructorHints だけはデフォルトで false になってるので書かなくても良いです。

感想

Rust 関連、だいたい公式のドキュメントを見れば必要なことが分かるので、大変ありがたい。

書き忘れたこと

  • REPL の話

Discussion