GemfileでのRubyバージョン指定を.ruby-versionから読む

Gemfile での Ruby バージョンの指定を、値の直書きではなく .ruby-version からの読み込みに変更する設定です。 https://github.com/rubygems/rubygems/pull/6876

例えば、Rails アプリケーションなんかで Gemfile に .ruby-version と同じ 3.3.0 を指定しているようであれば、以下のように記述できます。

-ruby '3.3.0'
+ruby file: '.ruby-version'

asdf に類するものを使っているようであれば、ruby file: '.tool-versions' と記します。 https://github.com/rubygems/rubygems/pull/6898

この設定によって Ruby のアップデート時のバージョンの更新ポイントを減らすことができます。

なお、古い Bundler ではこのオプションは使えないため、その場合は BUNDLED WITH の値を bundle update --bundler あたりで更新する必要があります。

 BUNDLED WITH
-   2.3.7
+   2.5.3

もし、古い環境で ruby File.read('.ruby-version').strip と Gemfile に書いているようであれば、新しい Bundler ではこんな感じで書くことができるのでここで紹介した DSL に沿っておくと良いと思います。

そんな感じの Bundler 小技でした。

ここからはおまけ。

これは RuboCop に入れれば良いのでは?と思った方は鋭い。以下の考慮点をどうするかで悩んでいるところ。

最初に考えるのは、この API に対応している Ruby 3.3 梱包のデフォルト Bundler だとしても、BUNDLED WITH が旧来のままだと ruby file: '.ruby-version' は書けない問題。ただし、これは BUNDLED WITH を見れば解決可。

で、本質的に難しいのは例えば CI 環境によっては .ruby-version のコピーが必要だと、ローカルで読めたファイルが CI で読み込みできずにエラーになることを防げません (つまり CI 環境への手入れが必要) 。そうなるとオートコレクトは提供せずに、このあたりはドキュメンテーションとする?そうすると、そこまで頑張ってまで Cop として入れるかというと、小技っぽい感じなのでやめておこうというのがいまのところ。過去の流れ も踏まえて、気が向いたらもう少し考えます。