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 はたまに間違った修正をすることがあるので。
-
自動テストが未整備、万一の場合の影響が大きい、上司が怖いなど。 ↩