LoginSignup
12
2

More than 1 year has passed since last update.

古くなってしまったrubocopを最新まで一気に上げたい人へ贈るバージョンアップの向き合い方

Last updated at Posted at 2022-11-06

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に関して精査しなくていいの?という声も聞こえてきそうですが、ここでは一旦一括でオンにしてしまって大丈夫です。

.rubocop.yml
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の記述を読み込んでくれます。

.rubocop_yml
+inherit_from
+  .rubocop_todo.yml

上記のコマンドと、rubocop_todo.ymlの読み込みにより、新しい違反ファイルはきちんと違反を摘出してくれて、従来から違反しているファイルは違反を検出しない、という振る舞いになります。

リリースをする

このタイミングで一旦リリースをしてしまって、rubocopのバージョンアップを行いましょう。

一つ一つのCopと向き合う

ここまでくればあと一息です。
.rubocop_todo.ymlに書かれた違反に関して一つ一つ握りつぶしていきましょう。
コミットの単位や、PRの単位に関しては、レビュワーが読みやすいように調整すると良いでしょう。
不要なCopをDisableにしたり、一部のファイル、行だけDisableにするなどの判断もここで行いましょう。
これを.rubocop_todo.ymlが空になるまで行いましょう。

まとめ

この記事で、古いrubocopを頑張って最新まで上げたいけど、違反が多くて悩んでる人の苦しみが少しでも和らげれば幸いです。
特にRuby3系へのアップデートでrubocopと向き合う必要が出た方は、頑張ってください。

12
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2