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