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として時間をかけて成長させていくのがいいような気がしている
(この辺はかけられるコストとかにもよると思うので正解は存在しないだろうけど)