TL;DR: Ruff は Rust で書かれた Python コードチェックツール(リンター+フォーマッター)で、Flake8 より 10〜100 倍高速です。30 万行の超大規模プロジェクトでもわずか 0.5 秒でチェックできます。2026 年現在、Ruff は Python エコシステムのデファクトスタンダードなコード品質ツールとして、Instagram、PyTorch、Jupyter、Apache Airflow といった有名プロジェクトで採用されています。この記事では Ruff のインストールから設定、Flake8/Black/isort からの完全移行ガイドまで、ゼロから使い方を解説します。
1. Ruff とは?
Ruff は Astral チーム(uv と同じチーム)によって Rust で開発された、Python エコシステム向けのオールインワン型コードチェックツールです。以下の複数のツールを統合しています。
| 置き換えられるツール | 機能 | Ruff ルールプレフィックス |
|---|---|---|
| Flake8 | コードスタイルチェック | F, E, W |
| Black | コードフォーマット | - |
| isort | import のソート | I |
| pyupgrade | Python バージョンアップ推奨 | UP |
| pylint | 高度なコード検査 | PL, SIM, C901 |
| autoflake | 未使用 import の自動削除 | F401, F841 |
Ruff がこんなに速い理由は?
- Rust コンパイル済み:Rust の性能は Python を大幅に上回り、解析速度が桁違いです
- 並列処理:複数コアを自動活用してファイルを並列スキャンします
- ゼロ依存:Python ランタイム不要。単一バイナリで動作します
- 増分キャッシュ:変更されたファイルのみをチェックするので、2 回目の実行はほぼ瞬時に完了します
Ruff の GitHub リポジトリ:https://github.com/astral-sh/ruff ⭐ 2026 年時点で Star 数が 35,000 を突破しています。
2. Ruff のインストール
Ruff はいくつかの方法でインストールできます。pip または公式インストールスクリプトがおすすめです。
# 方法 1:pip を使用(推奨)
pip install ruff
# 方法 2:uv を使用(より高速)
uv tool install ruff
# 方法 3:macOS Homebrew
brew install ruff
# 方法 4:公式インストールスクリプト
curl -LsSf https://astral.sh/ruff/install.sh | sh
# インストール確認
ruff --version
# 出力:ruff 0.9.x
インストールが完了すると、Ruff には主に 2 つのコマンドが用意されています。
ruff check:コードチェック(リンターモード)ruff format:コードフォーマット(フォーマッターモード)
3. クイックスタート:5 分でプロジェクトをチェック
テストファイル hello.py を作成します。
import os
import sys
import json # unused
def hello_world():
x=1+2
print("hello world")
return x
if __name__ == "__main__":
hello_world()
3.1 コードチェックの実行
ruff check hello.py
出力例:
hello.py:1:8: F401 [*] `os` imported but unused
hello.py:2:8: F401 [*] `sys` imported but unused
hello.py:3:8: F401 [*] `json` imported but unused
hello.py:5:1: W293 [*] Blank line contains whitespace
hello.py:7:6: E225 [*] Missing whitespace around operator
Found 5 errors.
[*] 5 fixable with the `--fix` option.
Ruff は 5 つの問題を正確に検出しました。未使用の import が 3 つ、余分な空白行が 1 つ、演算子の前後にスペースがないのが 1 つです。各エラーには --fix で自動修正可能かどうかの表示が付いています。
3.2 自動修正
ruff check --fix hello.py
実行後のファイル内容は自動的に修正されます。
def hello_world():
x = 1 + 2
print("hello world")
return x
if __name__ == "__main__":
hello_world()
3.3 コードフォーマット
ruff format hello.py
ruff format は Black と似ており、インデント、空行、クォートスタイルなどを自動調整して、プロジェクト全体のコードスタイルを統一します。
4. 設定ファイルの詳細
プロジェクトのルートディレクトリに pyproject.toml を作成して Ruff を設定します。
[tool.ruff]
# 対象 Python バージョン
target-version = "py312"
# 1 行の文字数制限
line-length = 88
# チェック対象のディレクトリ
src = ["src", "tests"]
# 除外するディレクトリ
exclude = [
".git",
".venv",
"__pycache__",
"build",
"dist",
]
[tool.ruff.lint]
# 有効にするルールセット
select = [
"E", # pycodestyle エラー
"W", # pycodestyle 警告
"F", # pyflakes
"I", # isort(import ソート)
"UP", # pyupgrade(バージョンアップ推奨)
"B", # flake8-bugbear(一般的なバグパターン)
"SIM", # flake8-simplify(コード簡素化)
"RUF", # Ruff 独自ルール
]
# 無視するルール
ignore = [
"E501", # 行が長すぎる(フォーマッターに任せる)
"E402", # import がファイルの先頭にない(一部のスクリプトで必要)
]
# 許容される最大複雑度
mccabe.max-complexity = 10
[tool.ruff.lint.per-file-ignores]
# テストファイルでは一部のルールを無視
"tests/**/*.py" = ["S101", "PLR2004"]
# マイグレーションファイルでは全ルール無視
"**/migrations/*.py" = ["ALL"]
[tool.ruff.format]
# クォートスタイル:シングルクォートまたはダブルクォート
quote-style = "double"
# インデントの種類
indent-style = "space"
# 末尾の改行
skip-magic-trailing-comma = false
4.1 よく使うルールセットの説明
| ルールセット | 説明 | 代表的なルール |
|---|---|---|
| E/W | pycodestyle スタイルチェック | E501 行が長すぎる、W292 ファイル末尾に改行がない |
| F | pyflakes エラー検出 | F401 未使用 import、F841 未使用変数 |
| I | import ソート | I001 import の順序が正しくない |
| UP | Python バージョンアップ | UP006 typing.List ではなく list を使用 |
| B | bugbear 一般的なバグ | B006 可変なデフォルト引数、B007 未使用のループ変数 |
| SIM | コード簡素化 | SIM101 重複する isinstance、SIM108 三項演算子の使用 |
| RUF | Ruff 独自ルール | RUF001 あいまいな文字、RUF005 結合ではなく展開 |
5. Black/isort/Flake8 からの完全移行ガイド
それまで Black + isort + Flake8 の組み合わせを使っていたプロジェクトは、Ruff に完全に移行できます。
5.1 旧ツールのアンインストール
pip uninstall black isort flake8 autoflake pyupgrade -y
5.2 Ruff の動作を互換に設定
pyproject.toml に Black 互換の設定を追加します。
[tool.ruff]
line-length = 88 # Black のデフォルト行幅
target-version = "py312"
[tool.ruff.format]
quote-style = "double" # Black のデフォルトはダブルクォート
indent-style = "space"
[tool.ruff.lint]
select = ["E", "W", "F", "I"]
5.3 プロジェクト全体を一括修正
# ステップ 1:すべての Python ファイルをフォーマット
ruff format .
# ステップ 2:チェックして自動修正
ruff check --fix .
# ステップ 3:残りの問題を確認(自動修正しない)
ruff check .
5.4 pre-commit との統合
.pre-commit-config.yaml を作成します。
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.9.0
hooks:
# フォーマットを先に実行
- id: ruff-format
# その後チェック
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
pre-commit フックをインストールします。
pip install pre-commit
pre-commit install
これで git commit のたびに、Ruff がステージングされたファイルのフォーマットとチェックを自動実行します。
6. CI/CD 統合の実践
6.1 GitHub Actions
name: Ruff Check
on: [push, pull_request]
jobs:
ruff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install Ruff
run: pip install ruff
- name: Run Ruff format check
run: ruff format --check .
- name: Run Ruff lint
run: ruff check --output-format=github .
6.2 GitLab CI
ruff:
image: python:3.12-slim
stage: test
script:
- pip install ruff
- ruff format --check .
- ruff check .
allow_failure: true # 最初は失敗を許可しておくと安心
6.3 大規模プロジェクトでのパフォーマンス最適化
超大規模プロジェクトでは、以下の最適化戦略が使えます。
# 変更されたファイルのみをチェック(CI 向け)
ruff check --diff .
# SARIF 形式で出力(GitHub Code Scanning 用)
ruff check --output-format=sarif . > results.sarif
# 特定のルールのみチェック
ruff check --select=F,E .
# Ruff の設定とキャッシュ状態を確認
ruff check --show-settings .
7. Ruff と競合ツールの比較
| 特徴 | Ruff | Flake8 | Black + isort |
|---|---|---|---|
| 言語 | Rust | Python | Python |
| 速度 | ⚡ 極高速(ミリ秒単位) | 低速(秒単位) | 中程度 |
| 機能範囲 | リンター+フォーマッター | リンターのみ | フォーマッターのみ |
| プラグインエコシステム | 組み込みルール | 豊富なプラグイン | プラグイン拡張 |
| 自動修正 | ✅ 対応 | ❌ 非対応 | ✅ 対応 |
| 設定方法 | pyproject.toml | .flake8/.cfg | pyproject.toml |
| Python 依存 | Python 不要 | 必要 | 必要 |
パフォーマンス実測
50 万行のプロジェクトでの計測結果:
- Ruff check:0.3 秒
- Flake8:45 秒
- pylint:120 秒
Ruff は Flake8 より約 150 倍、pylint より約 400 倍 高速です。
8. 上級者の使い方
8.1 カスタムルール
Ruff は pyproject.toml でルールの重要度をカスタマイズできます。
[tool.ruff.lint]
select = ["E", "F", "W"]
# 一部のルールをエラーではなく警告に設定
[tool.ruff.lint.flake8-errmsg]
max-string-length = 20
[tool.ruff.lint.pydocstyle]
convention = "google" # または "numpy", "pep257"
8.2 IDE との統合
VS Code:公式の Ruff 拡張機能 をインストールすると以下の機能が使えます。 - リアルタイムの lint チェック - 保存時に自動フォーマット - ワンクリックで修正案を適用
// .vscode/settings.json
{
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.codeActionsOnSave": {
"source.fixAll.ruff": "explicit"
}
}
}
PyCharm:External Tools で設定します。
- Settings → Tools → External Tools を開く
- Ruff を追加:Program は ruff、Arguments は check --fix $FilePath$
8.3 増分チェック(Watch モード)
# ファイルの変更を監視して自動再チェック
ruff check --watch .
8.4 HTML レポートの生成
# JSON 形式で出力。jq で処理可能
ruff check --output-format=json . | jq '.'
# または sarif 形式で GitHub Code Scanning と連携
ruff check --output-format=sarif . > ruff-results.sarif
9. よくある質問
Q1:Ruff は Flake8 を完全に置き換えられますか?
ほとんどの場合、はい。 Ruff は Flake8 の大部分のルール(E、W、F シリーズ)と、一般的なプラグインのルール(bugbear、eradicate など)を内蔵しています。ただし、非常にニッチな Flake8 プラグインを使っている場合は、Ruff に同等の実装があるか確認する必要があります。
Q2:Ruff は pylint の代わりになりますか?
完全に置き換えることはできません。 Ruff はコードスタイルと一般的なバグ検出に重点を置いていますが、pylint はより深いコード品質分析(複雑度スコアリング、重複コード検出など)を提供します。日常の開発には Ruff で十分ですが、厳格な品質監査には Ruff と pylint の併用がおすすめです。
Q3:Ruff の --fix は安全ですか?
非常に安全です。 Ruff の自動修正は明確な修正戦略があるルールにのみ適用され、セマンティックな変更は行いません。修正前には ruff check --diff . で変更内容を確認することをおすすめします。
Q4:Ruff はどの Python バージョンに対応していますか?
Ruff 自体は Python 3.7 〜 3.13 のコードチェックに対応しています。target-version で対象の Python バージョンを指定すれば、適切なアップグレード推奨も受けられます。
10. まとめ
Ruff は Python エコシステムのコード品質インフラとして定着しつつあります。Rust がもたらす圧倒的なパフォーマンス、豊富な内蔵ルール、そしてリンター+フォーマッターの一体化体験により、Python プロジェクトのコード品質管理がこれまでにないほどシンプルで効率的になりました。
アクションプラン:
pip install ruffでインストール- プロジェクトで
ruff check --fix .+ruff format .を実行 pyproject.tomlでルールをカスタマイズ- pre-commit と CI/CD パイプラインに統合
これだけで、プロジェクトのコード品質は劇的に向上します。しかも、すべて数分で完了します。
関連リンク:
- Ruff 公式ドキュメント:https://docs.astral.sh/ruff/
- Ruff GitHub:https://github.com/astral-sh/ruff
- uv ツール(Ruff と同じチーム):https://docs.astral.sh/uv/
- 関連リソース:linux-tutorials/linux-fileformat.md — Python のファイルフォーマットについて
- 関連リソース:linux-tutorials/ubuntu-dependency.md — Python パッケージ管理の基礎