環境
- ruby 3.2.2
- Rails 7.0.5
- rubocop 1.54.1 ※ 2023/7/5時点での最新版(以下も同様)
- rubocop-rails 2.20.2
- rubocop-rspec 2.22.0
- rubocop-performance 1.18.0
インストール
Gemfile
group :development do
gem 'rubocop', require: false
gem 'rubocop-performance', require: false
gem 'rubocop-rails', require: false
gem 'rubocop-rspec', require: false
end
導入
bundle exec rubocop --auto-gen-config
をすると、以下の通り.rubocop_todo.yml
と.rubocop.yml
とが生成されます。
.rubocop_todo.yml
.rubocop_todo.yml
# Offense count: 2
# Configuration parameters: Blacklist, Whitelist.
# Blacklist: decrement!, decrement_counter, increment!, increment_counter, toggle!, touch, update_all, update_attribute, update_column, update_columns, update_counters
Rails/SkipsModelValidations:
Exclude:
- 'app/controllers/application_controller.rb'
- 'spec/services/foo_spec.rb'
- 既存のコードを解析し、「違反しているものを一旦無視する」 ために、このファイルが生成されます。
- 違反しない形に修正して、このファイルから該当行を削除していきましょう。
- 後述しますが、可能であれば ソースコード内で、特定の rubocop の警告を無視する とした方が明示的に違反箇所が見えるので望ましいです(数が多い場合には、
.rubocop_todo.yml
を使うしかないかもしれませんが)。
.rubocop.yml
.rubocop.yml
inherit_from: .rubocop_todo.yml # .rubocop_todo.yml が空になったら、この行は削除しましょう。
:
- 設定例は、【Rails】RuboCop 設定編 を参照して下さい。
- デフォルト設定
自動修正
bundle exec rubocop -A
// or
bundle exec rubocop --auto-correct
// -A をつけない場合、「違反内容の出力」だけされます。
bundle exec rubocop
// ヘルプを見る
bundle exec rubocop --help
- 「自動修正」及び「違反内容の出力」をしてくれます。
- 複数項目に違反している場合、一番深刻なものを頭文字1文字で表します。
- Convention(C)
- Warning(W)
- Error(E)
- Fatal(F)
overcommit を使って commit 時に実行されるようにする
インストール
Gemfile
group :development do
gem 'overcommit'
end
セットアップ
bundle exec overcommit --install
bundle exec overcommit --sign
設定(.overcommit.yml)
.overcommit.yml
PreCommit:
RuboCop:
enabled: true
# この行は必ずしも必要ない
# command: ['bundle', 'exec', 'rubocop', '-c', './.rubocop.yml']
on_warn: fail # Treat all warnings as failures
一時的に hook を無効にして commit する場合
# 特定の commit を無効にする
SKIP=<hook_command>
e.g. SKIP=RuboCop git commit ...
# 全ての hook を無効にする
e.g. OVERCOMMIT_DISABLE=1 git commit ...
CircleCI を使って git push 時に実行されるようにする
CircleCI 2.1 設定サンプル(Rails + Rspec + Rubocop + Jest + ESLint + Yarn + Postgres)の以下を参考にして下さい。
- run_rubocop
- rubocop_job
ソースコード内で、特定の rubocop の警告を無視する(複数指定可)
複数行の場合
無視するCop(ルール)を指定する
# rubocop:disable Layout/LineLength, Style/StringLiterals
[...]
# rubocop:enable Layout/LineLength, Style/StringLiterals
但し、method に対して適応したい場合は、これでも大丈夫です。
rubocop:disable
だけでrubocop:enable
は不要です。
def method_name # rubocop:disable Metrics/AbcSize
[...]
end
全て無視する
# rubocop:disable all
[...]
# rubocop:enable all
一行の場合
for x in (0..19) # rubocop:disable Style/For