rubocopは定期的に新バージョンがリリースされていますが、最新もしくはそれに近いバージョンにきっちり保てているプロジェクトは案外少ないのではないでしょうか。
2023年の3月末でRuby2.7のサポートが終了するのですが、3.0移行のrubyでrubocopを動かすにはrubocopのバージョンを1.0.0以上にあげる必要があります。
上記の都合から慌ててrubocopのバージョンを上げる必要になった方もいると思います。
しかし、一気に全部やろうとすると、チーム開発であれば他のメンバーの開発とコンフリクトしますし、長時間対応している間に新しいバージョンが出て規則が追加されるので全部対応しきるのは難しいです。
この記事では、そんなrubocopで疲弊する未来が見えた読者の方へ愚直に向き合いすぎないrubocopのバージョンアップ方法を授けます。
とりあえずバージョンを上げる
まず兎にも角にもバージョンを上げるのが大事です。
そこでまずはrubocopのバージョンを上げてしまいましょう。
環境によってGemfileに書くのかgem install
するのか異なるの思うので、コマンドは割愛。
.rubocop.ymlにNewCops: enable
を追加する
新しいcopも適用するために.rubocop.ymlを編集して、NewCops
オプションをオンにします。
新しいcopに関して精査しなくていいの?という声も聞こえてきそうですが、ここでは一旦一括でオンにしてしまって大丈夫です。
AllCops:
NewCops: enable
rubocop --auto-gen-config
で一旦全部の違反を黙らせる
古いバージョンのrubocopから新しいバージョンにする時、大量に違反が検出される場合が多いと思います。
しかし、rubocopのバージョンを上げる時に一つ一つの違反と向き合うのは(元のバージョンが古ければ古いほど)正直辛いです。
そこで、一旦違反は全て黙らせてしまいましょう。
rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 999999
1.37以降はこちらのコマンドでも行うことができます。(@_ydahさん情報提供ありがとうございます!)
rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit
また、.rubocop.yml
に下記の記述を行いましょう。.rubocop_todo.yml
の記述を読み込んでくれます。
+inherit_from
+ .rubocop_todo.yml
上記のコマンドと、rubocop_todo.yml
の読み込みにより、新しい違反ファイルはきちんと違反を摘出してくれて、従来から違反しているファイルは違反を検出しない、という振る舞いになります。
リリースをする
このタイミングで一旦リリースをしてしまって、rubocopのバージョンアップを行いましょう。
一つ一つのCopと向き合う
ここまでくればあと一息です。
.rubocop_todo.ymlに書かれた違反に関して一つ一つ握りつぶしていきましょう。
コミットの単位や、PRの単位に関しては、レビュワーが読みやすいように調整すると良いでしょう。
不要なCopをDisableにしたり、一部のファイル、行だけDisableにするなどの判断もここで行いましょう。
これを.rubocop_todo.yml
が空になるまで行いましょう。
まとめ
この記事で、古いrubocopを頑張って最新まで上げたいけど、違反が多くて悩んでる人の苦しみが少しでも和らげれば幸いです。
特にRuby3系へのアップデートでrubocopと向き合う必要が出た方は、頑張ってください。