Rubocopは、バージョン毎に新しいCop(Lintのルール)が追加されたりCopの名前が変わったりします。そのためバージョンアップ後には、大抵は設定やソースコードを見直さなければなりません。
だいたい2週間に1回は行う作業なので、スムーズに作業できるよう手順を書き出しておきます。
0. 事前準備
普通の作業環境なら起きないはずですが・・・
- ユニットテストが整備されていること
- 現バージョンの
rubocop
を実行して通ること - gitツリー上に変更したファイルが無いこと(
git status
で確認できる) - 適切なgitブランチがチェックアウトされていること(
git branch
で確認できる)
1. バージョンアップ
rubocop や関連ライブラリのバージョンを上げます。
bundle update rubocop rubocop-performance rubocop-rails
2. ファイルを一括修正
rubocop --auto-correct
で、バージョンアップで追加されたCopによる問題点を修正します。
-
.rubocop_todo.yml
があるとチェックがスキップされるので一旦削除します。 - アプリ本体のコードに
--auto-correct
を適用することができない場合1は、例えばspec/
のみを修正対象にします。
echo '---' > .rubocop_todo.yml
bundle exec rubocop --auto-correct spec/
3. 設定ファイルを修正する
以下のようなCop名が変更された事によるエラーが出ることがあるので、.rubocop.yml
を修正します。
Error: The `Layout/FirstParameterIndentation` cop has been renamed to `Layout/IndentFirstArgument`.
4. .rubocop_todo.yml
を再生成する
rubocop --auto-gen-config
で再生成します。
bundle exec rubocop --auto-gen-config --exclude-limit 99999 --no-offense-counts --no-auto-gen-timestamp
なお、オプションはお好みでつけてください:
-
--exclude-limit 99999
: 問題のファイルが多くても全ファイル名が.rubocop_todo.yml
に出力されます(通常はファイル数が多いと.rubocop_todo.yml
には出力されなくなる)。 -
--no-offense-counts
: 問題点の出現数を出力しない。出現数があるとgit diff
が増えるため。 -
--no-auto-gen-timestamp
: 生成日時を出力しない。日時があるとgit diff
が増えるため。
5. rubocop
を実行する
問題点が見つからないことを確認します。
bundle exec rubocop # => 問題が指摘されない
問題点が見つかったら、修正します。
6. テストする
--auto-correct
などでコードを変更している場合は、もちろんテストします。Rubocop はたまに間違った修正をすることがあるので。
-
自動テストが未整備、万一の場合の影響が大きい、上司が怖いなど。 ↩