Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Ruby: Gemfileに.ruby-versionを読み込む便利技(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

Ruby: Gemfileに.ruby-versionを読み込む便利技(翻訳)

以下の過去記事で、Gemfile内に記述するRubyバージョン指定をゆるくすることを推奨したことがあります。これは現在でも価値のある方法ですが、それとは別にほとんどの場合でうまく動く方法を紹介します。

参考: Use Loose Ruby Versioning in Your Gemfile - Andy Croll

この便利なワンライナーを教えてくれたEmmaに感謝します。

postmodern/chruby - GitHub

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で追加されました。

asdf-vm/asdf - GitHub

関連記事

Rails: メソッド検索をsource_locationとbundle openで行う(翻訳)

Ruby: 数値の正負チェックはpositive?やnegative?で明確に書こう(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。