学習のアウトプットとして投稿しています。
何かご指摘がございましたらお願いいたします。
RuboCopとは
Rubyのコードを解析してくれる。コードに問題があるかどうかや、RuboCopで指定されているフォーマットに沿っているかなどを確認し、問題があった場合は指摘してくれる。直せる部分は自動修正してくれる機能がある。
実行環境
- macOS
- Ruby 2.6.7
- Rails 6.1.4.1
- RuboCop 1.22.0
設定
gemfileに以下を追加する。rubocopはターミナルから使用するので、require: false
を加える。これによりRailsアプリには自動的に読み込まれなくなる。
group :development do
gem 'rubocop', require: false
gem 'rubocop-rails', require: false
gem 'rubocop-performance', require: false
end
拡張gem
■ rubocop-rails
rubocop単体だと規約が厳しく問題箇所が多くなりすぎるため、Rails用に調整してくれる。
■ rubocop-performance
処理が遅くなるコードを指摘してくれる。
拡張gemはRuboCopの設定ファイル(.rubocop.yml
)を作成して、読み込む必要がある。
設定ファイルはRailsアプリと同じルートディレクトリに配置する。
require:
- rubocop-performance
- rubocop-rails
以上で設定は完了です。
あとは実際にコマンドラインで使っていきます。
% bundle exec rubocop
略
test/test_helper.rb:7:7: C: [Correctable] Style/ClassAndModuleChildren: Use nested module/class definitions instead of compact style.
class ActiveSupport::TestCase
^^^^^^^^^^^^^^^^^^^^^^^
64 files inspected, 282 offenses detected, 245 offenses auto-correctable
64ファイルチェックして282箇所コードに問題があることを指摘してくれています。その中の245箇所は自動修正可能です。自動修正はrubocopに続けて-a
オプションをつけて実行するとやってくれます。
--auto-gen-configオプションを用いたRuboCopの導入
指摘箇所が多すぎる場合は一つひとつ確認してコードを直していくと大変なので、--auto-gen-config
オプションを利用すると効率よくリファクタリングできる。
① rubocoop --auto-gen-configを実行する。
% bundle exec rubocop --auto-gen-config
略
Rails/WhereNot: # new in 2.8
Enabled: true
For more information: https://docs.rubocop.org/rubocop/versioning.html
Created .rubocop_todo.yml.
コマンド実行後は.robocop_todo.yml
ファイルが作成され合わせて、.rubocop.yml
にinherit_from: .rubocop_todo.yml
が追記され、rubocop実行時に.rubocop_todo.yml
ファイルも読み込まれるようになる。
#略
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: nested, compact
Style/ClassAndModuleChildren:
Exclude:
- 'test/sign_in_helper.rb'
- 'test/test_helper.rb'
# Offense count: 21
# Configuration parameters: AllowedConstants.
Style/Documentation:
Enabled: false
#略
.rubocop_todo.yml
にはエラーが起こっているファイルを除外したり、cop(検査する個々のルール)を無効にする設定が書かれている。そのため、いったんエラーを退避してくれるようになる。デフォルトではエラーが起こっているファイルが15より大きいとそのcopを無効にする設定となっている。--exclude-limit
オプションでファイル数を変更できる。
② .rubocop_todo.ymlファイルを編集していく
チームのコードスタイルにあっている設定の場合は、.rubocop_todo.yml
の設定を.rubocop.yml
に移動させる。修正すべき部分はコードを編集し、.rubocop_todo.yml
ファイルの設定項目を削除していく。
該当コードを修正後rubocop --regenerate-todo
を実行して、rubocop_todo.yml
ファイルを更新していく方法でも可能。
③ .rubocop_todo.ymlファイルの全ての設定項目を削除する
②を繰り返し、.rubocop_todo.ymlファイルの全ての設定項目が削除されたらRuboCopの導入が完了になります。
参考
【Rails】RuboCopの基本的な使用方法と出力の見方
Automatically Generated Configuration
パーフェクト Ruby on Rails 【増補改訂版】