RuboCop導入入門:インストールから設定・git commit時の自動実行まで

スポンサーリンク

RuboCop導入入門:インストールから設定・git commit時の自動実行まで

はじめに

RuboCopはRubyのコードスタイルをチェックするlinterで、Rubyスタイルガイドに基づいてコードの問題を検出します。個人開発からチーム開発まで幅広く使われており、Railsプロジェクトではほぼ必須のツールです。

この記事ではインストールから基本的な使い方、設定ファイルのカスタマイズ、git commit時の自動実行まで解説します。


インストール

Gemfileに追加してインストールします。

# Gemfile
group :development do
  gem 'rubocop', require: false
  gem 'rubocop-rails', require: false      # Railsプロジェクトの場合
  gem 'rubocop-rspec', require: false      # RSpecを使う場合
end
bundle install

Railsを使わない場合はRuboCop単体でも使えます。

gem install rubocop

基本的な使い方

コードをチェックする

bundle exec rubocop

特定のファイルやディレクトリだけチェックすることもできます。

bundle exec rubocop app/models/user.rb
bundle exec rubocop app/models/

出力の読み方

app/models/user.rb:5:3: C: Style/StringLiterals: Prefer single-quoted strings ...
app/models/user.rb:12:1: W: Metrics/MethodLength: Method has too many lines. [15/10]
  • ファイルパス:行:列 の形式で指摘箇所が表示される
  • C(Convention)、W(Warning)、E(Error)、F(Fatal)の4段階
  • コロンの後にCop名(Style/StringLiterals など)と内容が続く

自動修正

--autocorrect(または -a)オプションで自動修正できます。

bundle exec rubocop --autocorrect
bundle exec rubocop -a          # 短縮形

安全に自動修正できるもの(インデント、クォートの種類など)だけが修正されます。

--autocorrect-all(または -A)は安全でない修正も含めてすべて自動修正します。

bundle exec rubocop --autocorrect-all
bundle exec rubocop -A          # 短縮形

注意-A は動作が変わる可能性のある修正も行うため、実行後は必ずテストで確認してください。


設定ファイル(.rubocop.yml)

プロジェクトルートに .rubocop.yml を置くことでルールをカスタマイズできます。

基本構造

# .rubocop.yml
require:
  - rubocop-rails
  - rubocop-rspec

AllCops:
  NewCops: enable          # 新しいCopを有効化
  TargetRubyVersion: 3.3
  Exclude:
    - 'db/schema.rb'
    - 'db/migrate/**/*'
    - 'node_modules/**/*'
    - 'vendor/**/*'
    - 'bin/**/*'

よく使う設定例

メソッドの行数制限を緩める

Metrics/MethodLength:
  Max: 20          # デフォルトは10

クラスの行数制限を緩める

Metrics/ClassLength:
  Max: 200         # デフォルトは100

ドキュメントコメントを不要にする

Style/Documentation:
  Enabled: false

文字列リテラルのクォートスタイル

Style/StringLiterals:
  EnforcedStyle: double_quotes  # single_quotes または double_quotes

行の最大文字数

Layout/LineLength:
  Max: 120         # デフォルトは120
  Exclude:
    - 'spec/**/*'  # specは除外

特定のCopを特定のファイルで無効化

RSpec/ExampleLength:
  Enabled: false

Rails/SkipsModelValidations:
  Exclude:
    - 'spec/**/*'

ファイル単位での無効化

コメントで特定の行だけCopを無効にできます。

# rubocop:disable Style/StringLiterals
message = "Hello, world!"
# rubocop:enable Style/StringLiterals

result = some_long_method_call(arg1, arg2, arg3) # rubocop:disable Layout/LineLength

拡張gem

rubocop-rails

Railsに特化したルールを追加します。

# .rubocop.yml
require:
  - rubocop-rails

Rails:
  Enabled: true

代表的なCop:Rails/HasManyOrHasOneRails/SkipsModelValidationsRails/TimeZone など。

rubocop-rspec

RSpecのコードスタイルをチェックします。

require:
  - rubocop-rspec

代表的なCop:RSpec/ExampleLengthRSpec/MultipleExpectationsRSpec/DescribeClass など。


git commit時に自動実行する

方法1:git hookを直接設定する

.git/hooks/pre-commit を作成します。

touch .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
#!/bin/bash
# .git/hooks/pre-commit

# ステージされたRubyファイルだけチェック
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.rb$')

if [ -z "$STAGED_FILES" ]; then
  exit 0
fi

bundle exec rubocop $STAGED_FILES

if [ $? -ne 0 ]; then
  echo "RuboCopのチェックに失敗しました。修正してから再度コミットしてください。"
  exit 1
fi

デメリット.git/hooks/ はgit管理対象外のため、チームで共有できない。

方法2:overcommitで管理する(推奨)

overcommit はgit hookをGemfileで管理できるgemです。チーム全員が同じhookを使えます。

# Gemfile
group :development do
  gem 'overcommit', require: false
end
bundle install
bundle exec overcommit --install

.overcommit.yml を作成して設定します。

# .overcommit.yml
PreCommit:
  RuboCop:
    enabled: true
    on_warn: fail        # warningでもコミットを止める場合
    command: ['bundle', 'exec', 'rubocop']
bundle exec overcommit --sign   # hookをインストール

以降は git commit のたびにステージされたファイルに対してRuboCopが自動実行されます。

Running pre-commit hooks
RuboCop...........................................[PASSED]

✓ No pre-commit hook checks failed

失敗した場合はコミットがキャンセルされます。

Running pre-commit hooks
RuboCop...........................................

app/models/user.rb:5:3: C: Style/StringLiterals

✗ One or more pre-commit hooks failed

一時的にhookをスキップしたい場合は --no-verify を使います。

git commit --no-verify -m "WIP"

まとめ

  • bundle exec rubocop でコードスタイルをチェックできる
  • -a / -A オプションで自動修正できる
  • .rubocop.yml でプロジェクトに合わせてルールをカスタマイズする
  • rubocop-rails / rubocop-rspec で Rails・RSpec用のルールを追加できる
  • overcommit でgit commit時の自動チェックをチーム全体で共有できる

RSpecのテストの書き方は「RSpec入門:インストールからモデルスペックの書き方まで」を参照してください。

gemのバージョン管理は「Bundler入門:Gemfile・bundle install・bundle execの使い方まとめ」を参照してください。

タスクの自動化は「Rake入門:Rakefileの書き方からRailsでのカスタムタスク作成まで」を参照してください。

bundle / rake / rails コマンドの早見表は「Rails開発コマンド早見表:bundle / rake / rails の使い分けまとめ」を参照してください。