Ruby バージョンの指定
最終更新日 2024年03月08日(金)
Table of Contents
Ruby のバージョンの選択
ruby
キーワードを使用するには Bundler 1.2.x
以上を、Ruby のバージョン指定子を使用するには Bundler 1.13.x
以上をインストールする必要があります。
アプリの Gemfile
で ruby
キーワードを使用すると、Ruby の特定のバージョンを指定できます。
source "https://rubygems.org"
ruby "3.2.2"
# ...
Heroku では、アプリで処理できる最新の Ruby バージョンを実行することをお勧めします。Ruby 3.2.2 は最新の Ruby バージョンでない可能性があります。ここではデモンストレーションの目的でのみ使用しています。更新された一覧については、サポートされている Ruby バージョンを参照してください。
コミットして Heroku にプッシュすると、Ruby 3.2.2
が検出されたことが表示されます。
-----> Heroku receiving push
-----> Ruby/Rack app detected
-----> Using Ruby version: 3.2.2
-----> Installing dependencies using Bundler version 2.5.6
...
MRI 以外の Ruby エンジンを指定する場合は、:engine
および :engine_version
オプションを使用する必要があります。次の行を使用して JRuby を指定できます。
ruby "2.2.2", :engine => "jruby", :engine_version => "9.0.0.0"
使用可能なバージョンの一覧については、Ruby サポートを参照してください。
Ruby のバージョン指定子
Bundler 1.12
以降では、Ruby バージョンにバージョン指定子を使用できます。たとえば、3.2.2
を使用してデプロイするが、チームの一部のメンバーが 3.2.3
を使用する必要がある場合は、次を指定して実現できます。
ruby "~> 3.2.2"
これは、x が 2 以上の 3.2.x
の全バージョンが有効であることを示しています。これを Heroku で機能させるには、3 つのすべての桁を含むフルバージョンを指定する必要があります。たとえば、Heroku では ~> 3.2
や ~> 3.2.x
は有効なバージョン指定子ではありません。
Bundler はローカルで使用されている Ruby バージョンを Gemfile.lock
でロックします。上のシナリオでは、システム上に Ruby 3.2.1
が存在するユーザーが bundle install
を実行した場合、そのユーザーは Gemfile.lock で次を受け取ります。
RUBY VERSION
ruby 3.2.2p53
Gemfile.lock
のこのバージョンを更新するには、ローカルの Ruby バージョンを変更し、Gemfile
に ruby
宣言があることを確認して次を実行します。
$ bundle update --ruby
Ruby バージョンのロックされたバージョンは常に “受け入れられ” ます。そのため、チームの別のメンバーが異なる Ruby バージョンを使用している場合、そのメンバーは Gemfile.lock
に間違ったバージョンをコミットしないように注意する必要があります。
Heroku で使用されるバージョンがわからない場合は、次のコマンドをローカルで実行して確認できます。
$ bundle platform --ruby
環境を使用した Ruby バージョンの指定
Bundler 2.3 以前を使用している場合は、環境変数を使用して Ruby のバージョンを設定できます。Gemfile
は Ruby コードで構成されているため、環境で Ruby バージョンを指定することもできます。次に例を示します。
ruby ENV['CUSTOM_RUBY_VERSION'] || '2.5.1'
環境変数を変更しても、アプリは再コンパイルされません。Ruby は各 slug にベンダリングされるため、この方法を使用して Ruby バージョンの変更を有効にするには、アプリを再度デプロイする必要があります。
これにより、CUSTOM_RUBY_VERSION
環境変数で Ruby バージョンを指定できます。この変数が設定されていない場合は、デフォルトで 2.5.1
になります。これは、継続的インテグレーションツールでアプリを実行しており、それによりコードベースが他のバージョンの Ruby に対して確実にチェックされるが、Heroku にデプロイされるときは特定のバージョンに制限するようにしたい場合に便利です。
Gemfile
での環境変数の使用を制限することをお勧めします。条件付きの使用はお勧めしません。プライベートリポジトリのユーザー名またはパスワードなどの情報を設定する必要がある場合は、「Bundler の設定」を参照してください。
トラブルシューティング
Gemfile で Ruby のバージョンを指定したが、Heroku に別のバージョンがインストールされる
Bundler 2.4 以降、Bundler は Ruby のバージョンが Gemfile.lock
でロックされていない場合は Ruby のバージョンを出力しなくなりました。Heroku が Ruby のバージョンを読み取ることができるようにするには、次のコマンドをローカルで実行します。
$ bundle platform --ruby
No ruby version specified
のような出力が表示された場合、次のコマンドで Gemfile.lock
のバージョンをロックする必要がある場合があります。
$ bundle update --ruby
$ git add Gemfile.lock
$ git commit -m "update ruby version"
Ruby バージョンは
このエラーの最も一般的な原因は、Gemfile
を変更した後に Gemfile.lock
が更新されなかったことです。これを修正するには、次を実行してください。
$ bundle update --ruby
$ git add Gemfile.lock
$ git commit -m "update ruby version"
Ruby バージョンが、指定された現在のバージョンとは異なっていることを示すエラーが引き続き表示される場合は、考えられる原因がいくつかあります。
まず、ローカルで最新バージョンの Bundler を使用していることを確認してください。少なくとも Heroku と同じバージョンを実行することをお勧めします。このバージョンは、次を実行することによってローカルで確認できます。
$ bundler -v
Bundler version 1.13.6
最新バージョンの Bundler を使用していることを確認したら、次を実行して、アプリで指定したバージョンを確認します。
$ bundle platform --ruby
ruby 2.3.3p222
これが想定していたものでない場合は、Gemfile.lock
の中をチェックします。
$ cat Gemfile.lock | grep -A 2 RUBY
RUBY VERSION
ruby 2.3.3p222
これは Bundler で優先されるバージョンです。これが想定したものでない場合は、bundle install
をローカルで実行すると、Gemfile.lock
の Ruby バージョンがローカルで実行している任意のバージョンに設定されます。
Heroku にプッシュしたときに、依然としてそのエラーが表示される場合は、変更を Git にコミットしたことを確認します。
$ git add Gemfile.lock
$ git commit -m "Gemfile.lock ruby version"
また、プロジェクトの master
ブランチにいることも確認してください。
$ git status -b
On branch master
git push heroku master
を実行するときにマスターとは別のブランチにいる場合、このコマンドは git push heroku master:master
のショートカットです。つまり、ローカルリポジトリのマスターが Heroku のマスターブランチに送信されます。testing-feature-1
などのマスター以外のブランチにデプロイしたい場合は、git push heroku testing-feature-1:master
を実行する必要があります。
この混乱を回避する 1 つの方法として、Heroku レビューアプリを設定し、コミットがマスターにマージされたら継続的インテグレーション (CI) サーバーに Heroku にデプロイさせます。
移行
Ruby のデフォルト以外のバージョンに移行するアプリケーションでは、bin
がその PATH
環境設定内の最初のエントリである必要があります。この値は Ruby buildpack で設定されるため、変更しないでください。この設定の現在の値は、heroku config
を使用して特定できます。
$ heroku run bash
$ env | grep PATH
PATH=/app/bin:/app/vendor/bundle/bin:/app/vendor/bundle/ruby/2.2.0/bin:bin:vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin```
If absent or not the first entry you should ensure you’re using the supported version of the Ruby buildpack. If you are, please open a support ticket.
If the PATH
is set correctly you will see the expected version using heroku run
:
$ heroku run "ruby -v"
Running `ruby -v` attached to terminal... up, run.1
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
PATH
が正しく設定されていない場合は、次のエラーが表示されることがあります。
Your Ruby version is 1.9.2, but your Gemfile specified 1.9.3
PATH が正しく設定されているときは、不適切なハッシュタグ (#!) 行がコミットされている場合にこのエラーが表示されることがあります。たとえば、bin/bundle
が次の行で始まる場合です。
#!/usr/bin/env ruby1.9.1
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
load Gem.bin_path('bundler', 'bundle')
これにより、不適切なバージョンの Ruby を使用しようとします。次のように、1 行目でバージョンを指定しないようにしてください。
#!/usr/bin/env ruby
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
load Gem.bin_path('bundler', 'bundle')
Bundler のエラー
Bundler 1.1.4
以下を使用している場合は、次のエラーが表示されます。
undefined method `ruby' for #<Bundler::Dsl:0x0000000250acb0> (NoMethodError)
ruby
キーワードを使用するには、Bundler 1.2.0
以上をインストールする必要があります。
$ gem install bundler