Rubocopのバージョンアップ作業の改訂版です。
Rubocopは頻繁にルールが改定されれるため、バージョンアップの際には設定やソースコードを見直さなければなりません。
だいたい2週間に1回は行う作業なので、スムーズに作業できるよう手順を書き出しておきます。
Rubocopは、バージョン毎に新しいCop(Lintのルール)が追加されたりCopの名前が変わったりします。そのためバージョンアップ後には、大抵は設定やソースコードを見直さなければなりません。
だいたい2週間に1回は行う作業なので、スムーズに作業できるよう手順を書き出しておきます。
0. 事前準備
Rubocopのバージョンアップ前に以下を済ませましょう。
- ユニットテストが整備されていること
- 現バージョンの
rubocopを実行して通ること - gitツリー上に変更したファイルが無いこと(
git statusで確認できる) - 適切なgitブランチがチェックアウトされていること(
git branchで確認できる)
1. バージョンアップ
rubocop や関連ライブラリのバージョンを上げます。
# 例
bundle update rubocop rubocop-performance rubocop-rails
2. rubocop --autocorrectで自動修正
コードの問題点を修正します。
bundle exec rubocop --autocorrect spec/
rubocop には自動修正オプションが2種類あります。
-
rubocop --autocorrectはスペースの使い方など比較的安全な修正のみを行います。 -
rubocop --autocorrect-allはより野心的な修正を行います。
また、テストコードのみを自動修正するか、本体のコードまで自動修正してしまうかという、選択もあります。プロジェクトのテスト体制に応じて塩梅します。
3. 設定ファイルを修正する
以下のようなCop名が変更された事によるエラーが出ることがあるので、.rubocop.ymlを修正します。
Error: The `Layout/FirstParameterIndentation` cop has been renamed to `Layout/IndentFirstArgument`.
4. .rubocop_todo.yml を再生成する
rubocop --regenerate-todo で再生成します。
bundle exec rubocop --regenerate-todo --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp
なお以下のオプションを使うと git diff が読みやすくなります:
-
--no-exclude-limit: 問題のファイルが多くても全ファイル名が.rubocop_todo.ymlに出力されます。 -
--no-offense-counts: 問題点の出現数を出力しない -
--no-auto-gen-timestamp: 生成日時を出力しない
5. rubocop を実行する
問題点が見つからないことを確認します。
bundle exec rubocop # => 問題が指摘されない
問題点が見つかったら、修正します。
6. コードレビュー&テスト
通常のコードレビュー・テストを行います。