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/HasManyOrHasOne、Rails/SkipsModelValidations、Rails/TimeZone など。
rubocop-rspec
RSpecのコードスタイルをチェックします。
require: - rubocop-rspec
代表的なCop:RSpec/ExampleLength、RSpec/MultipleExpectations、RSpec/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 の使い分けまとめ」を参照してください。