Ruby バージョンの指定
最終更新日 2018年10月23日(火)
Table of Contents
Ruby のバージョンの選択
ruby
キーワードを使用するには Bundler 1.2.x
以上を、Ruby のバージョン指定子を使用するには Bundler 1.13.x
以上をインストールする必要があります。
アプリの Gemfile
で ruby
キーワードを使用すると、Ruby の特定のバージョンを指定できます。
source "https://rubygems.org"
ruby "2.5.1"
# ...
Heroku では、アプリで処理できる最新の Ruby バージョンを実行することをお勧めします。Ruby 2.5.1 は最新の Ruby バージョンでない可能性があり、ここではデモンストレーションのためにのみ使用しています。更新された一覧については、サポートされている Ruby バージョンを参照してください。
コミットして Heroku にプッシュすると、Ruby 2.5.1
が検出されたことが表示されます。
-----> Heroku receiving push
-----> Ruby/Rack app detected
-----> Using Ruby version: 2.5.1
-----> Installing dependencies using Bundler version 1.7.11
...
MRI 以外の Ruby エンジンを指定する場合は、:engine
および :engine_version
オプションを使用する必要があります。次の行を使用して JRuby を指定できます。
ruby "2.2.2", :engine => "jruby", :engine_version => "9.0.0.0"
使用可能なバージョンの一覧については、Ruby サポートを参照してください。
Ruby のバージョン指定子
Bundler 1.12
+ の時点では、Ruby バージョンにバージョン指定子を使用できます。たとえば、2.3.0
を使用してデプロイしたいが、チームの一部のメンバーが 2.3.1
を使用したいと考えている場合は、次を指定することによってこれを許可できます。
ruby "~> 2.3.0"
これは、2.3.x
(x は 0 以上) のすべてのバージョンが有効であることを示しています。これを Heroku で機能させるには、3 つのすべての桁を含むフルバージョンを指定する必要があります。たとえば、~> 2.3
も ~> 2.3.x
も Heroku での有効なバージョン指定子ではありません。
Bundler は、ローカルで使用されている Ruby バージョンを Gemfile.lock
でロックします。上のシナリオでは、システム上に Ruby 2.3.1
が存在するユーザーが bundle install
を実行した場合、そのユーザーは Gemfile.lock で次を受け取ります。
RUBY VERSION
ruby 2.3.1p112
Gemfile.lock
のこのバージョンを更新するには、ローカルの Ruby バージョンを変更し、次を実行します。
$ bundle update --ruby
Ruby バージョンのロックされたバージョンは常に “受け入れられ” ます。そのため、チームの別のメンバーが異なる Ruby バージョンを使用している場合、そのメンバーは Gemfile.lock
に間違ったバージョンをコミットしないように注意する必要があります。
Heroku で使用されるバージョンがわからない場合は、次のコマンドをローカルで実行して確認できます。
$ bundle platform --ruby
環境を使用した 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 の設定」を参照してください。
トラブルシューティング
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