Skip to main content

RuboCopの設定について

🎯 この記事で学ぶこと

RuboCopの基本的な使い方と、プロジェクトに応じた設定のカスタマイズ方法を学びます。

📚 RuboCopとは

RuboCopは、Rubyコードの静的解析ツール(Linter)です。コーディングスタイルの統一、潜在的なバグの検出、ベストプラクティスの適用をサポートします。

🔍 主な機能

  1. コードスタイルの統一

    • インデント、空白、改行などの一貫性を保つ
    • チーム開発での可読性向上
  2. 潜在的な問題の検出

    • 未使用の変数
    • 到達不可能なコード
    • 非効率な処理
  3. 自動修正

    • 多くの違反は自動で修正可能
    • -aオプションで安全な修正を実行

⚙️ 基本的な設定ファイル

.rubocop.ymlファイルでプロジェクト固有の設定を行います:

.rubocop.yml
# 必要なプラグインの読み込み
require:
- rubocop-rails # Rails用のルール
- rubocop-rspec # RSpec用のルール

# 全体的な設定
AllCops:
NewCops: enable # 新しいルールを自動で有効化
TargetRubyVersion: 3.4 # 対象のRubyバージョン
Exclude: # チェック対象外のファイル
- 'db/**/*' # マイグレーションファイル
- 'bin/**/*' # 実行ファイル
- 'config/**/*' # 設定ファイル
- 'vendor/**/*' # 外部ライブラリ
- 'spec/spec_helper.rb'
- 'spec/rails_helper.rb'

🛠 よく使うルールのカスタマイズ

1. ドキュメンテーション関連

# クラスやモジュールのコメントを必須にしない
Style/Documentation:
Enabled: false

# frozen_string_literal コメントを必須にしない
Style/FrozenStringLiteralComment:
Enabled: false

2. メトリクス関連

# メソッドの行数制限を緩和
Metrics/MethodLength:
Max: 20 # デフォルトは10

# クラスの行数制限を緩和
Metrics/ClassLength:
Max: 200 # デフォルトは100

# ブロックの行数制限(RSpecなど)
Metrics/BlockLength:
Exclude:
- 'spec/**/*' # テストファイルは除外
- 'config/routes.rb' # ルーティングファイルも除外

3. RSpec関連

# 1つのテスト内で複数のexpectを許可
RSpec/MultipleExpectations:
Enabled: false

# exampleの説明文の長さ制限を緩和
RSpec/ExampleLength:
Max: 10

# ネストの深さ制限を緩和
RSpec/NestedGroups:
Max: 5

4. Rails関連

# Strong Parametersのテストスタイルを緩和
Rails/StrongParametersExpect:
Enabled: false

# 動的なfind_byを許可
Rails/DynamicFindBy:
Enabled: false

# present?/blank?の使用を強制しない
Rails/Present:
Enabled: false

🎮 RuboCopの実行方法

基本的な使い方

# 全ファイルをチェック
rubocop

# 特定のディレクトリのみチェック
rubocop app/

# 特定のファイルのみチェック
rubocop app/models/user.rb

# 自動修正(安全な修正のみ)
rubocop -a

# 自動修正(より積極的な修正)
rubocop -A

# 違反をすべて表示(通常は省略される)
rubocop --display-cop-names

# 現在の違反を許可する設定を生成
rubocop --auto-gen-config

Dockerを使用している場合

# Dockerコンテナ内で実行
docker compose exec web rubocop

# 自動修正
docker compose exec web rubocop -a

💡 段階的な導入方法

既存のプロジェクトにRuboCopを導入する場合:

1. 現状の把握

# 違反の一覧を確認
rubocop --format offenses

# 自動生成で現在の違反を許可
rubocop --auto-gen-config

これにより.rubocop_todo.ymlが生成され、現在の違反が一時的に許可されます。

2. 段階的な改善

.rubocop.yml
# TODOファイルを読み込む
inherit_from: .rubocop_todo.yml

# 新しいコードには適用する
AllCops:
NewCops: enable

3. 優先順位を付けて修正

  1. 自動修正可能なものから始める
  2. セキュリティに関わるものを優先
  3. パフォーマンスに関わるものを次に
  4. スタイル関連は最後に

🏢 チーム開発での活用

1. CI/CDへの組み込み

GitHub Actionsの例:

.github/workflows/rubocop.yml
name: RuboCop

on: [push, pull_request]

jobs:
rubocop:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: 3.4
- run: bundle install
- run: bundle exec rubocop

2. pre-commitフックの設定

.git/hooks/pre-commit
#!/bin/sh
# 変更されたRubyファイルのみチェック
files=$(git diff --cached --name-only --diff-filter=ACM | grep "\.rb$")
if [ -n "$files" ]; then
bundle exec rubocop $files
fi

3. エディタとの連携

VS Codeの場合、Ruby LSP拡張機能をインストールすることで、リアルタイムでRuboCopの警告を確認できます。

📋 トラブルシューティング

よくある問題と解決方法

  1. 「Too many offenses」エラー

    # 違反の上限を増やす
    rubocop --fail-level error
  2. 特定のファイルで誤検知

    # rubocop:disable Style/Documentation
    class TemporaryClass
    # 処理
    end
    # rubocop:enable Style/Documentation
  3. パフォーマンスが遅い

    # キャッシュを有効化
    AllCops:
    UseCache: true
    CacheRootDirectory: tmp/rubocop_cache

🎯 まとめ

RuboCopは強力なツールですが、すべてのルールを厳格に適用する必要はありません。プロジェクトの性質やチームの方針に合わせて、適切にカスタマイズすることが重要です。

✅ おすすめの方針

  1. 新規プロジェクト: 最初から厳しめの設定で開始
  2. 既存プロジェクト: 段階的に導入、自動修正から始める
  3. テストコード: ルールを緩和して書きやすさを優先
  4. 本番コード: セキュリティとパフォーマンスのルールは厳格に

📚 参考資料