LoginSignup
128
114

【Rails】RuboCop 導入編(2023年7月版)

Last updated at Posted at 2020-05-03

環境

インストール

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 が空になったら、この行は削除しましょう。
:

自動修正

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 の警告を無視する(複数指定可)

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
128
114
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
128
114