Ruby
Gemfile

Gemfile.lockアップデートガイド

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.1rspec (< 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