0. はじめに
おはよう、Ruby エンジニアの皆さん。2022 年も年の瀬となりましたが、元気にしていますか?
実を言うと Ruby 2.7.x はもうだめです。突然こんなこと言ってごめんね。
でも本当です。今年の 4/12 に Ruby 2.7.6 がリリースされました。
それが終わりの合図です。程なく始まるセキュリティメンテナンスフェーズは 1 年しかないので気をつけて。
それがやんだら、少しだけ間をおいて終わりがきます。
1. 要するに、来年の 4 月で Ruby 2.7.x のサポートが終了します
そんなわけで、見て見ぬ振りをしてきた、あなたのプロジェクトの Ruby バージョンの更新も、ついには年貢の納め時というわけです。まだ時間は残されていますので、年内から調査と検討を開始しましょう
さて、Ruby 2.7.x
以下からバージョンを上げる場合、次のメジャーバージョンは少し飛んで 3.0.x
になるのですが、ここには大きな非互換が潜んでいます。そう、Ruby 本体を始め、Rails やほとんどの Gem が修正対応を余儀なくされた、
位置引数とキーワード引数の分離 (Separation of positional and keyword arguments)
への対応が必要になるのです。
2. 「位置引数とキーワード引数の分離」とは
詳細な説明については、以下の公式ガイドに譲るとして、この非互換な変更は、Ruby 2.7.0
の段階で既に含まれておりました。ただ、あまりに影響が大きいことが予想されたため、2.7.0
の時点では、修正が必要なコードがあってもエラーとはならず、deprecation warning が出力されるだけの対応でした。これが、3.0.0
以降の Ruby バージョンになると、しっかりエラーを起こすようになります。
参考: Ruby 3.0における位置引数とキーワード引数の分離について
3. 修正箇所を静的コードチェックで検出できないの?
Ruby 自らが warning を出してくれるということで、チェックツールぐらいどこかに存在してそうに思えますが、私が探してみた限り、そんなものはありませんでした。「Rubocop で対応を検討していたが、誤検出が多かったのでマージが見送られた」というような話しもどこかで聞いた気がするのですが、記憶が定かでないです。この辺のお話しに詳しい方がいらっしゃいましたら、ぜひコメントで教えてください
ともかく、要修正箇所を洗い出すところから、自分たちの手でなんとかする必要があります
4. Ruby 2.7.2 以降は deprecation warning がデフォルト非表示になっている件
実はそうなんです。Ruby 2.7.0
で「位置引数とキーワード引数の分離」に関する deprecation warning を出力する対応が入ったものの、Ruby 2.7.2
からは、上記を含む deprecation warning 出力自体がデフォルト非表示になってしまっています。なので、大抵の環境では、コマンドラインオプションを使うなどして、deprecation warning の出力を ON にするところから始める必要があります。
参考: Ruby 2.7.2 リリース
5. 組み込みライブラリ module Warning
を使おう
とは言え、希望はあります。Ruby 2.5.0
以降であれば、Ruby の warning 出力を制御できる、Warning という組み込みライブラリが利用できます。Warning.warn
をオーバーライドするだけで、メッセージのフィルタリングや、出力先の変更が可能です。これを利用して、要修正箇所を収集するコードを書いてみました。とりあえず Rails 向けに書いたのですが、Rails 以外でもちょっと改変すれば使えると思います。
参考: module Warning
参考: Ruby 2.5のカスタマイズ可能なWarningモジュール(翻訳)
6. 次の記事に続く...
で、そのコードなのですが、この記事が長くなっちゃったので、次の記事に分けます 以下のクソダサいタイトルの記事へどうぞ