目的
コーディングルールが浸透していない Rails アプリケーションに Lint ツールを導入する
RuboCop とは
- RuboCop is a Ruby static code analyzer. というわけで平たくいうと Lint ツール
- たくさんの設定項目があり、微調整できるとのこと
導入
導入の仕方は README の通り Gemfile に下記を追記する
gem 'rubocop', '~> 0.51.0', require: false
- インストール確認は下記
$ bundle exec rubocop -v
使い方
// カレントディレクトリ配下のすべての Ruby ファイルをチェックする $ bundle exec rubocop // 指定したディレクトリ(今回は app/)配下の Ruby ファイルをチェックする $ bundle exec rubocop app/
- コマンドのオプションは下記にたくさんある
- Basic Usage - RuboCop: The Ruby Linter that Serves and Protects
- 使えそうなオプション
- --list-target-files
- Lint 対象のファイル一覧を表示
- --display-cop-names
- cop の名前を表示する(例えば Metrics/LineLength など)
- --auto-correct
- 検出した問題を自動で修正
- --list-target-files
チェック項目
- あくまで一例だが、下記の項目などがチェック対象になる
- ハッシュの
{
の後ろと}
の前にスペースがあるか? - 文字列補完が必要ないのにダブルクォートを使っていないか?
- 一行あたりの文字数が 80 文字以内か?
- メソッドの
return
が省略できる場合に省略しているか? - メソッドの処理がない時は一行で書いているか?
- 代替メソッドの提案
- 例えば
xx == 0
の代わりにxx.zero?
は使えないか?などをチェックしてくれる
- 例えば
- ハッシュの
独自ルールの適用
チェック対象やチェック項目を独自のルールにしたい場合は .rubocop.yml ファイルを用意する
Ruby のバージョンも指定できる
AllCops: TargetRubyVersion: 2.4
既存のアプリケーションに導入してみる
事前準備
- 現在の状態をチェックする
$ bundle exec rubocop --display-cop-names
- 現在の状態をチェックした上で todo ファイルを作る (.rubocop_todo.yml ファイルが作られる)
$ bundle exec rubocop --display-cop-names --auto-gen-config
- RuboCop の設定ファイル .rubocop.yml を作る
// .rubocop_todo.yml を読み込むようにしておく $ echo "inherit_from: .rubocop_todo.yml" >> .rubocop.yml
- 上記の手順で設定ファイルを用意し、再度チェックを走らすと .rubocop_todo.yml に記載された問題が無視され、検出されない状態になる
- .rubocop_todo.yml から 1 つの問題を削除する (例えば Style/StringLiteralsInInterpolation)
- この状態で rubocop を走らせるとエラーが検知されるので対象ファイルを修正する
- ちなみに Style/StringLiteralsInInterpolation は
--auto-correct
対象なので、オプションを付ければ自動で修正される
$ bundle exec rubocop --display-cop-names --auto-correct