DevContainerでRuffを使うための設定をしたい【備忘録】

お疲れ様です。

最近の業務でリンターやフォーマッターを使う中でRuffが結構良いなと思ったので、個人開発の環境にも設定してみました。

Ruffとは

Rust製の高速なコードフォーマッター・リンターです。 パッケージ管理ツールのuvと同じ開発元が作成しています。 uvと同じように各種設定を1つの"pyproject.toml"内に記載できる点も便利に思っています。

docs.astral.sh

環境設定

過去に作成したuvを使用したDevContainerのテンプレートにRuffを追加しました。

github.com

インストール

"pyproject.toml"にRuffのインストール設定を追加しました。

コンテナの立ち上げ時にuv syncが走るようになっているので、このタイミングでuvによってインストールされます。 「dependency-groups」の"dev"に設定しています。 これによりコマンドによってインストールするライブラリを制御できるので、例えばリリースの時にgroup=devのライブラリを含めないようにできたりします。

[project]
name = "uv-devcontainer-template"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = []

[dependency-groups]
dev = [
    "ruff>=0.15.11",
]

Ruffの機能設定

上述の通り、"pyproject.toml"内にRuff本体の設定を記載します。

下記のサイトを参考に設定しました。サイト内の説明がかなり詳しいので併せてどうそ。 自身の環境や好みに応じて設定を変更するようにすると良いと思います。 zenn.dev

[tool.ruff]
line-length = 100
target-version = "py313"
exclude = [
    ".git",
    ".venv",
    "__pycache__",
]

[tool.ruff.lint]
select = [
    "E",
    "W",
    "F",
    "I",
    "C",
    "B",
    "UP",
]
ignore = ["E501", "C901", "UP015"]

[tool.ruff.lint.isort]
known-first-party = ["src"]
combine-as-imports = true

VSCodeの設定

DevContainerはVSCodeの機能なので、Ruffの導入に併せてVSCode側の設定も行いました。 こちらの設定により、pyファイルの保存をするたびにコード成形とリントチェックを自動で実行してくれます。

下記のサイトを参考にしました。併せてどうぞ。 zenn.dev

対応したこととしては、Ruffの拡張機能のインストールと"settings.json"の作成です。

まず、Ruffの拡張機能のインストールですが、"devcontainer.json"に記載してコンテナ立ち上げ時に自動でインストールされるように設定しています。 charliermarsh.ruffがRuffの拡張機能です。

{
    "name": "uv",
    "build": {
      "dockerfile": "../Dockerfile"
    },
    "customizations": {
      "vscode": {
        "settings": {
          "terminal.integrated.defaultProfile.linux": "bash"
        },
        "extensions": [
          "ms-python.python",
          "kevinrose.vsc-python-indent",
          "mhutchie.git-graph",
          "eamodio.gitlens",
          "charliermarsh.ruff"
        ]
      }
    },
    "forwardPorts": [8000],
    "remoteUser": "root",
    "runArgs": ["--gpus", "all"],
    "postCreateCommand": "uv sync --no-cache"
}

次に"settings.json"の作成です。 先ほどインストールした拡張機能をデフォルトのフォーマッター・リンターに指定し、保存時の自動適用を有効にしています。

{
    "[python]": {
        "editor.formatOnSave": true, 
        "editor.codeActionsOnSave": {
            "source.fixAll": "explicit", 
            "source.organizeImports": "explicit" 
        },
        "editor.defaultFormatter": "charliermarsh.ruff"
    },
    "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python"
}

動作確認

ここまでの設定後にコンテナを立ち上げ、確認用のPythonコードを用意しました。 GitHub Copilotで"pyproject.toml"をコンテキストにして設定を確認するためのコードを生成してもらいました。

設定が正常に適用されているとこのようにリントエラーがある部分に黄色い波線が表示されていることがわかります。

lint_error_code

これを保存(Ctrl+S)すると、リントチェックが適用され削除可能なものは削除されます。 一部unsafeなリントエラーがありこれらは自動修正されずに残っています。 こちらは"pyproject.toml"に下記の設定を追加することで自動修正を有効にできますが、思わぬ不具合が起こる可能性があるので注意が必要です。

[tool.ruff]
unsafe-fixes = true

lint_check