Ruby: Gemfileに.ruby-versionを読み込む便利技(翻訳)
以下の過去記事で、Gemfile内に記述するRubyバージョン指定をゆるくすることを推奨したことがあります。これは現在でも価値のある方法ですが、それとは別にほとんどの場合でうまく動く方法を紹介します。
参考: Use Loose Ruby Versioning in Your Gemfile - Andy Croll
この便利なワンライナーを教えてくれたEmmaに感謝します。
chrubyなどのRubyバージョンマネージャは、個別のアプリケーションのrootディレクトリ内に置かれている.ruby-version
ファイルを探索することで、アプリケーションで指定のRubyバージョンが必ず使われるようにします。
アプリケーションで必要なRubyバージョンをこの.ruby-version
ファイルで指定すると、バージョンマネージャは環境を自動で切り替えて指定のRubyバージョンを使うようにします。
bundlerを使うと、RubyバージョンをGemfile内で指定することも可能です。bundlerによる方法は、デプロイされるアプリケーションで使うRubyバージョンを定義するのによく利用されます。
参考: Bundler: The best way to manage a Ruby application's gems
🔗 以下のようにしていると...
Rubyバージョンを2箇所で厳密に指定すると競合が発生する可能性がある。
# Gemfile
ruby "3.0.0"
# .ruby-version
3.1.2
bundlerはGemfile
で指定された現在のRubyバージョンをチェックするため、以下のエラーが発生します。
Your Ruby version is 3.0.0, but your Gemfile specified 2.7.2
🔗 Rubygems 2.4.19より前ならこう書ける
Gemfile
もまたRubyファイルであることを利用する。
# Gemfile
ruby File.read(".ruby-version").strip
# .ruby-version
3.1.2
🔗 今ならこう書かける
file
引数を使う。
# Gemfile
ruby file: ".ruby-version"
# .ruby-version
3.1.2
この機能強化は2023年8月のリリースでプルリク#6876によって追加され、その後いくつかバグ修正が行われました。
アプリケーションで最新のRubygemとbundlerを取得するには、以下のコマンドを実行する必要がある「かもしれません」。
gem update --system
bundle update --bundler
🔗 そうする理由
こうすることで、Rubyをアップグレードするときに更新するファイルが.ruby-version
だけで済むようになります。
私たちのほとんどは、ほぼ間違いなくあらゆる環境でRubyバージョンを喜んで指定します。この繊細かつ見事な改修は、GemfileもまたRubyスクリプトであることを思い出させてくれます。
🔗 そうしない理由があるとすれば
新しいRubyバージョンの導入が遅れているサービスがまだあるので、そういう場所では例のRubyバージョンの指定を緩くする手法の方がプロジェクトに合う可能性もあります。
🔗 追加情報
Rubyバージョンマネージャ単体を使う代わりに、複数のツールをASDFで管理しているのであれば、Gemfileに書くfile:
引数に.tool-versions
ファイルも指定できます。
この機能は、2023年9月にリリースされたRubygem 2.4.20のプルリク #6898で追加されました。
概要
元サイトの許諾を得て翻訳・公開いたします。