👷‍♂️

Dev Container で VSCode 拡張機能付きの Rust 開発環境を構築する

2024/11/11に公開
1

ローカル環境に Rust をインストールすることなく、Rust の開発環境を構築していきましょう!

まずは Docker と VSCode の拡張機能 Dev Containers をインストールしておきましょう!

Microsoft 製のイメージを使う

Dev Container で Rust を 簡単に使える ようにするには Microsoft 製のイメージがおすすめです。

devconainer.json を作成する

ルートディレクトリに .devcontainer/devconainer.json を作成します。

なお、Rust で実装する際に便利な VSCode 拡張機能も定義してありますが、詳細については後述します。

devcontainer.json
{
  "name": "Rust Sandbox on Dev Container",
  "image": "mcr.microsoft.com/devcontainers/rust:latest",
  "customizations": {
    "vscode": {
      "extensions": [
        "vadimcn.vscode-lldb",
        "fill-labs.dependi",
        "tamasfe.even-better-toml",
        "Swellaby.vscode-rust-test-adapter",
        "JScearcy.rust-doc-viewer",
        "rust-lang.rust-analyzer"
      ]
    }
  }
}

Dev Container を起動する

Dev Container を起動して、ターミナルを開きます。

まずは Rust やパッケージマネージャである Cargo がインストールされていることを確認してみます!

rustc --version
cargo --help

Hello world!

Rust の開発環境が整ったので、Rust アプリケーションのプロジェクトを作成していきましょう!

ルートディレクトリ直下に src が来るようにしたいので、以下のコマンドを実行します。

cargo init .

無事に cargo init ができら、cargo run を実行しましょう!

$ tree -I target/
.
├── Cargo.lock
├── Cargo.toml
└── src
    └── main.rs

拡張機能がインストールされるので、fn main() の上にある RUN をクリックして実行することも可能です。

自分で Dockerfile を作成する

すでに便利なイメージがあるため、それを活用することもできますが、
自分で Dockerfile や docker-compose.yml を作成することで Dev Container 環境を構築することもできます。

とは言え、Rust のイメージを使えば Dockerfile も数行の記述で終わります。

https://github.com/codemountains/rusty-sandbox

git clone で、すぐに Rust 開発環境を構築できます。

git clone https://github.com/codemountains/rusty-sandbox.git

Dockerfile

Docker Official Image である rust を使用します。

フォーマッターや Clippy が入っていないため、別途インストールしています。

Dockerfile
FROM rust

RUN rustup component add rustfmt clippy

docker-compose.yml

上述した Dockerfile を指定します。

特筆すべき点はありません笑

docker-compose.yml
version: '3'
services:
  sandbox:
    build: 
      context: .
      dockerfile: Dockerfile
    working_dir: /workspace
    volumes:
      - .:/workspace
    stdin_open: true
    tty: true

devcontainer.json

先ほどとの違いは dockerComposeFile などを定義している点でしょうか。

また、同様に VSCode の拡張機能を定義しています。

devcontainer.json
{
  "name": "Rust Sandbox on Dev Container",
  "dockerComposeFile": "../docker-compose.yml",
  "service": "sandbox",
  "workspaceFolder": "/workspace",
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-azuretools.vscode-docker",
        "vadimcn.vscode-lldb",
        "fill-labs.dependi",
        "tamasfe.even-better-toml",
        "Swellaby.vscode-rust-test-adapter",
        "JScearcy.rust-doc-viewer",
        "rust-lang.rust-analyzer"
      ]
    }
  }

Cargo Workspace の構成

Cargo Workspace を使った構成を取っています。

複数のアプリを追加できるなど汎用性も高く、複数のライブラリクレートにパッケージを分割できビルド時間の短縮が望めるなどメリットが大きいです。

app をデフォルトの実行ターゲットとしているので、cargo run で簡単に実行できます。

Rust のための VSCode 拡張機能

Rust を快適に書くための拡張機能として、以下を使えるようにしています。

rust-analyzer

Rust 公式の Language Server Protocol (LSP) です。

コード補完、シンタックスハイライトなど様々なことが可能になります!

もはや、どの言語においても LSP がないと快適にコードは書けません。必須です。

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

CodeLLDB

コンパイル言語をデバッグするための拡張機能です。

ブレークポイントを置いて、サクサク開発を進めましょう。

https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb

Rust Test Explorer

VS Code サイドバーから Rust テストを表示および実行できる、Rust テスト エクスプローラーです。

テストコードを一覧表示してくれ、実行することが可能です。

https://marketplace.visualstudio.com/items?itemName=swellaby.vscode-rust-test-adapter

Rust Doc Viewer

ローカルで生成されたプロジェクト ドキュメントを取得し、簡単に参照できるように新しいウィンドウに表示してくれます。

https://marketplace.visualstudio.com/items?itemName=JScearcy.rust-doc-viewer

Dependi

クレート(ライブラリ)を管理することが楽になります。

crates という拡張機能がありますが、メンテナンスが終了しアーカイブされているため Dependi を使うことが推奨されています。

https://marketplace.visualstudio.com/items?itemName=fill-labs.dependi

https://www.dependi.io/

Even Better TOML

TOML ファイルでコード補完が効くようになります。

Cargo.toml などを編集する際などに便利です。

https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml

まとめ

VSCode 拡張機能込みで、Rust の開発環境を Dev Container で構築してみました!

Dev Container は便利ですね✌️

Discussion

HikaruooHikaruoo

素晴らしいチュートリアルです! 💡Rust開発環境をDev Containerで手軽にセットアップできる方法がわかりやすく解説されていて、すぐに試したくなりました。個人的に、rust-analyzerとCodeLLDBの組み合わせが最強だと思っています。