`AllCops: MigratedSchemaVersion`パラメータをRuboCop Rails 2.28で追加した

RuboCop Rails 2.28.0をリリースした。

github.com

新機能としては AllCops: MigratedSchemaVersion パラメータの追加となる。

機能概要

.rubocop.yml の AllCops の下に以下のような MigratedSchemaVersion パラメータを追加して使う。パラメータ値となるマイグレーションバージョン値までのマイグレーションファイルに対して、マイグレーション関連の Cop が無視するようになります。

AllCops:
  MigratedSchemaVersion: '20241225000000'

すでにプロダクション適用済みのマイグレーションファイルに対して、警告が表示されて場合によってはオートコレクトしてしまうと、以降のローカル環境での bin/rails db:migrate 実行と本番環境に差異が出てしまうという問題対策への機能で、マイグレーション適用済みの db/migrate/*/.rb は無視すべきだろうを実現します。

パラメータの値としては設定時に一番進んでいるマイグレーションのバージョン値あたりにしておけば大きくハズれないとは思うものの、どのマイグレーション済みバージョンのマイグレーションファイルまでを無視したいかは自分で設定することにしています。

この MigratedSchemaVersion パラメータは一度設定しさえすれば、以降は本番環境未適用のマイグレーションのみがマイグレーション関連 Cop で指摘されるようになるので、原則更新不要な値になる想定でいます。

こぼれ話

提案されていることとして、この MigratedSchemaVersion が未設定の場合はなんらかの値を設定するように警告を出すのはどうかというのがあるのですが、あまりノイジーになってもなあというのと、確かにメッセージを出さないと隠しパラメータ感があるので追い追いの検討としています。

現在の実装としては RuboCop::Cop::MigrationsHelper というマイグレーション関連のモジュールを prepend している Cop がこのパラメータの対象となります。マイグレーションファイル名関連の Cop は警告して修正されても影響がないものの、結局「その警告が出て嬉しいの?」というと大した警告ではないこともあり、余計なことを考えずに一貫させたという判断です。

実装は以下の PR を参照してください。

github.com