はじめに
現在、ポートフォリオとしてオリジナルアプリを作成中ですが、自分一人でコードを書いているとついつい自分が読めれば問題ないコードを書きがちになってしまいます。
変な癖が付かないように、その辺も意識していきたいということで、RuboCopを導入することにしました。導入で学んだことを忘れないようにここに綴ります。
RuboCopとは
RuboCopとは、Ruby向けの静的解析ツールである。Ruby Style Guideのコーディング規約に従って、コードが書かれているかチェックするためのgemである。
参考:RuboCop // Docs
RuboCopをインストール
Gemfileに記入
group :development do
gem 'rubocop', require: false
gem 'rubocop-rails', require: false
end
インストール
$ bundle
RuboCopを使ってみる
$ bundle exec rubocop
(余談ですが、bundle execって何?という時は bundler、bundle execについて ※自分用メモ の記事がオススメ。)
なんだかエラーがたくさん出てしまった・・・
直さなければいけないところが書かれているので親切だけど、全部直すには時間がかかり過ぎてしまう。
ということで以下のコマンドを実行
$ rubocop --auto-gen-config
すると、.rubocop_ymlと.rubocop_todo.ymlの2つのファイルが生成される。
.rubocop_todo.yml
.rubocop_todo.ymlファイルの生成によって、先ほど大量に出た警告が一旦無視されるように設定される。すなわち.rubocop_todo.ymlに書かれているかぎり、RuboCopに怒られなくて済むということである。
試しにもう一度 budle exec rubocop を実行すると、警告が出なくなっている。
とはいえあくまでも今は一時的に警告を回避しているに過ぎないので、このファイルに何も書かれていなくてもRuboCopから警告文が表示されない状況に持っていくことが最終的な目標となる。
警告をなくす
Bundler/OrderedGems:
Exclude:
- 'Gemfile'
Layout/SpaceInsideArrayLiteralBrackets:
Exclude:
- 'config/environments/production.rb'
Layout/TrailingEmptyLines:
Exclude:
- 'Gemfile'
例えば、.rubocop_todo.ymlに上記のような記載があったら、まずは
Bundler/OrderedGems:
Exclude:
- 'Gemfile'
をコメントアウトして、bundle exec rubocop を実行。すると警告文が出る。
このあとの手順は2パターンある。
①警告に従って、コードを修正する
②コードは変えず、警告のデフォルト変更・もしくは今後警告を出さないように設定する
①は文章通り、該当ファイルを開いて、コードを修正するということ。
.rubocop.yml
②については、先ほど .rubocop_todo.ymlと同時に生成された .rubocop.ymlに設定を書いていく。
- RuboCopの対象から外す時
inherit_from: .rubocop_todo.yml
AllCops:
# 除外するファイル
Exclude:
- "config/environments/*"
- "vender/**/*"
- "bin/**"
- "db/**/*"
- "tmp/**/*"
- "lib/**/*"
- "Gemfile"
自分でExcludeを設定する時は、デフォルトの設定が外れてしまうため、それらも改めて明記する必要がある。
ちなみに、上記のファイルの最上部にinherit_from: .rubocop_todo.yml があるが、この一文がないと、.rubocop_todo_ymlに書かれた内容が反映されないので注意。
- Copの無効化
Copとは、RuboCopにおける1つのルールのことである。
上から3つ目までのCopは、有効にするか無効にするかを記述しないとエラーが出るので書く。
Style/HashEachMethods:
Enabled: true
Style/HashTransformKeys:
Enabled: true
Style/HashTransformValues:
Enabled: true
# 日本語のコメントを許可する
Style/AsciiComments:
Enabled: false
警告文に対してどちらかの対処を行ったら、コメントアウトした警告を削除する。
.rubocop_todo.ymlの中身がなくなるまでこの繰り返し。
まとめ
- .rubocop.yml:コーディングのルールを記載
- .rubocop_todo.yml:現在の違反部分を記載 (名前の通りToDoリスト的な役割だ!)
.rubocop_todo.ymlの違反を1つずつチェックして、コードを修正もしくは新たなルールを作って.rubocop.ymlに記載するのがRuboCopの基本的な使い方である。
おわりに
とにかく今後はRuboCopを適宜利用して、規約に沿ったコードを書いていきたいと思います。本記事で何かツッコミどころ、おかしな点などあればご教示いただけると幸いです。
尚、本記事は以下を参考にしています。