Gemfile.lockアップデートガイド
しばらくバージョンアップされていないプロジェクトのGemfile.lock
のアップデートは大変です。
重要な更新から順番に一歩一歩アップデートしていきましょう。
Rails アップグレードガイド
Bunler日本語ドキュメント
rubygems.org
(このドキュメントは随時更新します)
今一番更新が必要なgem1つに絞る
複数のgemを同時にアップデートするとそれによりバグった際の問題切り分けが困難になります。
bundler update rails
のように引数として渡すことで、指定したgemのみを更新できます。
bundle update | Bundler日本語ドキュメント
Gemfile
# (snip)
gem 'rails'
Command
$ bundle update rails
Bundler could not find compatible versions for gem “xxxxxx”
バージョンの依存関係解決できなかったときは以下のようなメッセージが表示され、アップデートに失敗します。
$ bundle update rspec-rails
Bundler could not find compatible versions for gem "rspec-core":
In Gemfile:
guard-rspec was resolved to 4.2.8, which depends on
rspec (< 4.0, >= 2.14) was resolved to 3.0.0, which depends on
rspec-core (~> 3.0.0)rspec-rails (~> 3.4.1) was resolved to 3.4.1, which depends on rspec-core (~> 3.4.0)
bundler
は依存ツリーを辿りながら、登場するすべてのgemのバージョン指定の解決を試みます。
このメッセージから以下のことがわかります。
-
gem 'guard-rspec'
はguard-rspec 3.4.1
を選択-
guard-rspec 3.4.1
はrspec (< 4.0, >= 2.14)
に依存していて、rspec 3.0.0
を選択-
**rspec 3.0.0**
は**rspec-core (~> 3.0.0)**
(3.0.x)に依存している
-
-
-
gem 'rspec-rails', '~> 3.4.1'
でrspec-rails 3.4.1
を選択 -
**rspec-rails 3.4.1**
は**rspec-core (~> 3.4.0)**
(3.4.x)に依存している
**rspec 3.0.0**
が問題で**rspec-core (~> 3.4.0)**
をインストールできないということです。
ですので、この場合は以下のようにアップデート対象にrspec
を含めてやればよいことになります。
$ bundle update rspec-rails rspec
アップデート幅はなるべく小さくなるようにする
一度に大きな更新をすると、非互換の変更が入り込む可能性も大きくなりますし、どのバージョンで変更があったのかも調べづらくなります。
gemにもよりますが、少なくともメジャーバージョンが上がるときは1つ、できればマイナーバージョンも1つづつ上げるようにしましょう。
しばらくバージョンアップをしていなかったプロジェクトの場合、Gemfile
での指定ががないと一気に大きくバージョンアップしてしまいがちなので、事前にrubygems.orgを確認しておきましょう。
Gemfile
gem 'rails'
現在のバージョン
$ bundle show rails
/home/takeyuweb/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rails-4.1.16
最新のバージョン
https://rubygems.org/gems/rails 記事作成時点で5.1.4
4.1の次のマイナーバージョン最新
https://rubygems.org/gems/rails/versions 記事作成時点で4.2.10
Gemfileを更新
gem 'rails', '~> 4.2', '>= 4.2.10'
更新
$ bundle update rails