Rubocopの導入と設定

に公開

「Rubocop」のインストール

Grmfile
group :development do
:
:
  gem 'rubocop', require: false
  gem 'rubocop-performance', require: false
  gem 'rubocop-rails', require: false
  gem 'rubocop-minitest', require: false
  gem 'rubocop-packaging', require: false
  gem 'rubocop-rspec'end

を追加し「bundle install」

username:~/environment/アプリケーション名 $ bundle install

###設定ファイルの追加
Rubocopの設定ファイルを作成します。
次のコマンドを入力してください。

username:~/environment/アプリケーション名 $ bundle exec rubocop --auto-gen-config

.rubocop_todo.ymlと.rubocop.ymlが生成されます。
.rubocop.ymlを編集します。
https://github.com/rails/rails/blob/main/.rubocop.yml
を参照し設定する。

今回は

AsciiComments: #日本語手のコメントを許可する
  Enabled: false 
Performance:
  Exclude:
    - '**/test/**/*'

を追加し
マジックコメントを追加してくれと指示する

Style/FrozenStringLiteralComment:
  Enabled: true
  EnforcedStyle: always
  Exclude:
    - 'actionview/test/**/*.builder'
    - 'actionview/test/**/*.ruby'
    - 'actionpack/test/**/*.builder'
    - 'actionpack/test/**/*.ruby'
    - 'activestorage/db/migrate/**/*.rb'
    - 'activestorage/db/update_migrate/**/*.rb'
    - 'actionmailbox/db/migrate/**/*.rb'
    - 'actiontext/db/migrate/**/*.rb'
    - '**/*.md'

変数展開や文字列中にシングルクォートを含む場合など、特別な理由がなく
ダブルクォートを使っていないかチェックする

Style/StringLiterals:
  Enabled: true
  EnforcedStyle: double_quotes

該当部分の末尾に余計な空白が存在していると警告する
見やすいように追加した改行も含まれる

# No trailing whitespace.
Layout/TrailingWhitespace:
  Enabled: true

を削除した。

実際に「Rubocop」を使ってみる

username:~/environment/アプリケーション名 $ bundle exec rubocop

※次の警告が出る場合

Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)' has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)' instead.

次のコマンドを実行してください。

ec2-user:~/environment/アプリケーション名 $ bundle update --bundler

これでエラー部分の表示がされる。

また、Rubocopはコーディング違反を直してくれるコマンドがあります。
解析の実行コマンドに-aのオプションをつけるだけです。

username:~/environment/アプリケーション名 $ bundle exec rubocop -a

その他の実行方法

実際に「Rubocop」を使ってみるでは.rubocop.ymlで解析対象外のフォルダ、ファイルを指定しているとはいえ、多くのフォルダやファイルが解析対象となって解析を行っています。
実務の場合アプリケーションのプロジェクトファイルがとても多かった場合に、.rubocop.ymlに記載ある解析対象外のフォルダやファイルを毎回、解析していたのでは時間がかかってしまう場合があります。
この場合、解析対象をファイル単位、フォルダ単位、リモートブランチとの差分があるファイルに対して解析を行うといったほうが実用的です。
それぞれの実行方法について紹介しておきます。

ファイル単位で実行
username:~/environment/アプリケーション名 $ bundle exec rubocop -a {解析対象ファイル}
フォルダ単位で実行
username:~/environment/アプリケーション名 $ bundle exec rubocop -a {解析対象フォルダ}
origin/masterとの差分があるファイルに対して実行
username:~/environment/アプリケーション名 $ bundle exec rubocop -a $(git diff $(git merge-base origin/master HEAD) --diff-filter=d --name-only)

設定内容は実装ごとに自分に必要な警告内容に編集しながら実装する必要がありそう。

Discussion