LoginSignup
104

More than 1 year has passed since last update.

posted at

updated at

【Rails】RuboCop 導入編(2020年10月版)

環境

インストール

Gemfile
group :development do
  gem 'rubocop', require: false
  gem 'rubocop-performance', require: false
  gem 'rubocop-rails', require: false
  gem 'rubocop-rspec'
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 の警告を無視する(複数指定可)

複数行の場合

無視する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

注意点

「複数行の場合」のやり方では disable にならず、「一行の場合」のやり方をすると期待通り disable される場合があります。
原因はよく分かっていません。

参照先

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
What you can do with signing up
104