🐶
【Ruby/Ruby on Rails】非推奨の機能は警告を出すようにしよう
非推奨の機能ってなに?
非推奨の機能は、公式が将来的に削除する可能性のある機能のことです。
Ruby2.7.1までは、非推奨になった機能はデフォルトでターミナル上に警告が出力されていましたが、Ruby2.7.2以降ではオプションを付けないと警告が出ません。
もしも非推奨機能を使い続けると…
1. 予期せぬエラーの発生
- 特定の機能が動作しなくなったり、予想外の挙動になる
- アプリケーションが突然クラッシュする
2. パフォーマンスの低下
- メモリ使用量が増加したり、リソース消費が非効率になる
- アプリケーション全体の実行速度が遅くなる
3. セキュリティリスク
- 既知の脆弱性にさらされる危険性がある
4. アップデートがより困難になる
- 互換性の問題が増加する
- アップデートに要する時間とコストが増大する
などなど、対策が大変になるので、非推奨になった機能は定期的にリファクタリングしたほうが良さそうということはわかるかと思います。
でも毎回Rubyのリリースノートをチェックするのは大変ですし、コード全体を隅々まで覚えている人はいないと思うので、自動で警告が出るようにする方が良いでしょう。
対策
次のいずれかの方法がありますが、Railsではデフォルトで1.の対応策が実行されています。
1. active_support.deprecationを使う(Railsのデフォルト機能)
config/environments/ディレクトリ直下にある適切な環境設定ファイルに以下の内容を記述しましょう。
これは、development環境で非推奨警告をロガーに出力し、利用してはならない非推奨警告が存在する場合は例外を発生させるものです。
development環境では:logが、test環境では:stderrがそれぞれ設定されます。production環境ではこの設定は無視され、config.active_support.report_deprecationsの設定が使われます。
# develop環境の場合
# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log
# Raise exceptions for disallowed deprecations.
config.active_support.disallowed_deprecation = :raise
# Tell Active Support which deprecation messages to disallow.
config.active_support.disallowed_deprecation_warnings = []
2. "-W:deprecated" オプション付きでプログラムを実行する
例えば、Hogeという非推奨機能があって、それをirbで実行する際には以下のようにすると警告が出ます。
$ RUBYOPT=-W:deprecated irb
irb(main):001:0> Hoge yourfile.rb
(irb):1: warning: Hoge is deprecated; use Hoge instead
=> false
3. プログラム内で "Warning[:deprecated] = true" を使う
develop環境かtestの時だけ使いたいなどの場合には、それぞれ適切な環境設定ファイルなどに記述しましょう。
Warning[:deprecated] = true
まとめ
小さな対策ではありますが、これらの積み重ねが大きな事故を防ぐ重要なポイントになります。こうした設定を行ない、大切なプロダクトを守り育てていきましょう!
Discussion