RuboCopの設定について
🎯 この記事で学ぶこと
RuboCopの基本的な使い方と、プロジェクトに応じた設定のカスタマイズ方法を学びます。
📚 RuboCopとは
RuboCopは、Rubyコードの静的解析ツール(Linter)です。コーディングスタイルの統一、潜在的なバグの検出、ベストプラクティスの適用をサポートします。
🔍 主な機能
-
コードスタイルの統一
- インデント、空白、改行などの一貫性を保つ
- チーム開発での可読性向上
-
潜在的な問題の検出
- 未使用の変数
- 到達不可能なコード
- 非効率な処理
-
自動修正
- 多くの違反は自動で修正可能
-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. 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の警告を確認できます。
📋 トラブルシューティング
よくある問題と解決方法
-
「Too many offenses」エラー
# 違反の上限を増やす
rubocop --fail-level error -
特定のファイルで誤検知
# rubocop:disable Style/Documentation
class TemporaryClass
# 処理
end
# rubocop:enable Style/Documentation -
パフォーマンスが遅い
# キャッシュを有効化
AllCops:
UseCache: true
CacheRootDirectory: tmp/rubocop_cache
🎯 まとめ
RuboCopは強力なツールですが、すべてのルールを厳格に適用する必要はありません。プロジェクトの性質やチームの方針に合わせて、適切にカスタマイズすることが重要です。
✅ おすすめの方針
- 新規プロジェクト: 最初から厳しめの設定で開始
- 既存プロジェクト: 段階的に導入、自動修正から始める
- テストコード: ルールを緩和して書きやすさを優先
- 本番コード: セキュリティとパフォーマンスのルールは厳格に