2020-05-19
既存プロジェクトへrubocopを導入する道すじ
新規アプリケーションならまだしも、既存のプロジェクトへrubocopを入れると警告がとんでもないことになるので
どのように入れていくのがいいのか、一つの案としてメモしておく
基本
- rubocopとはRubyのコード解析ツール
- Rubyは様々な書き方ができるが、チームで統一されたスタイルでコードを書くことが可能になる
.rubocop.yml
の設定に応じて以下の5つに関して指摘が行われる- LayOut (レイアウトに関するCop)
- Lint (誤りである可能性が高い部分やbad practiceを指摘するCop)
- Metrics (クラスの行数や文字数などに関してのCop)
- Naming (命名規則に関するCop)
- Style (スタイルについてのCop)
.rubocop_todo.yml
ファイル- これは「現状違反しているが、一旦例外として除外する違反リスト」のこと
- 将来直すべき違反リストなので、このファイルを消しても違反がでなくなるようにするのが最終的なゴールとなる
手順
- gemを入れる
rubocop
,rubocop-performance
,rubocop-rails
,rubocop-rspec
あたり- groupは
:development
だけでよさそう
- デフォルトのルールは厳しいのでhttps://relaxed.ruby.style/から設定をもらって、アプリルートへコピー
- ルートにファイル増えまくるのが嫌なら
.rubocop
ディレクトリとか作ってもいいかも - デフォルトのルールで構わん!という方は不要
- ルートにファイル増えまくるのが嫌なら
- 以下のような内容で
.rubocop.yml
をルートへ配置する
inherit_from:
- .rubocop/relaxed-ruby-style.yml # 公式の通り直リンクでもOK
require:
- rubocop-performance
- rubocop-rails
- rubocop-rspec
AllCops:
TargetRubyVersion: X.X.X
Exclude:
- .git/**/*
- node_modules/**/*
- vendor/**/*
- bin/**/*
- これで
bundle exec rubocop
を実行すると、ルールに沿ってコードをチェックしてくれる - が、大量に警告が出て即座に対応するのは無理なので、
bundle exec rubocop --auto-gen-config
で.rubocop_todo.yml
生成し一旦全てエラーは無視する.rubocop.yml
のinherit_from
に.rubocop_todo.yml
が追加されているはず.rubocop_todo.yml
は中をみればわかると思うが、各ルールに引っかかったファイルを除外する設定が書かれている- これによりエラーは無視され、rubocopが通るようになる(ただ臭いものに蓋をしてるだけだけど)
- あとはオートコレクトで簡単に解消できそうなものからやっていく
.rubocop_todo.yml
を見てやるのがいいrubocop --only Layout/SpaceInsideHashLiteralBraces -a
みたいなのをコツコツやっていく- 直したら
bundle exec rubocop --auto-gen-config
で更新するのを忘れずに
.rubocop_todo.yml
で対応が難しそうなものは.rubocop.yml
へ移動させるといい- 最終的に
.rubocop_todo.yml
は消えることが目標なので
- 最終的に
ネットに .rubocop.yml
はいくらでも公開されているけど、個人的に安易な利用は避けるべきだと思う
使うとしても脳死コピペするのではなく、内容はよく確認するべき
結構チーム内で決めないといけないスタイルとかもあるので
導入するのであれば、そのアプリに最適化したrubocopとして時間をかけて成長させていくのがいいような気がしている
(この辺はかけられるコストとかにもよると思うので正解は存在しないだろうけど)