もちろん、ある時点で、アプリケーションが依存している特定の依存関係のバージョンを更新したい場合があります。たとえば、railsを3.0.0 finalに更新したい場合などです。重要なのは、1つの依存関係を更新するからといって、すべての依存関係を再解決し、すべての最新バージョンを使用したいわけではないということです。この例では、依存関係は3つだけですが、この場合でも、すべてを更新すると問題が発生する可能性があります。
例として、rails 3.0.0.rc gemはactionpack 3.0.0.rc gemに依存し、これはrack ~> 1.2.1(つまり>= 1.2.1かつ< 1.3.0)に依存しています。 rack-cache gemはrack >= 0.4に依存しています。 rails 3.0.0 final gemもrack ~> 1.2.1に依存しており、rails 3.0.0のリリース以降、Rackチームはrack 1.2.2をリリースしたと仮定しましょう。
Railsを更新するためにすべてのgemを単純に更新すると、rack 1.2.2が取得されます。これはrails 3.0.0とrack-cacheの両方の要件を満たします。ただし、rack-cacheの更新を specifically には要求していません。これは、rack 1.2.2と互換性がない可能性があります(何らかの理由で)。 rack 1.2.1からrack 1.2.2への更新はおそらく何も壊さないでしょうが、同様のシナリオがはるかに大きなジャンプを伴って発生する可能性があります。(詳細は以下の[1]を参照)
この問題を回避するために、gemを更新するときに、別のgemがまだ依存している場合、bundlerはそのgemの依存関係を更新しません。この例では、rack-cacheがまだrackに依存しているため、bundlerはrack gemを更新しません。これにより、railsの更新がrack-cacheを誤って破損することがなくなります。 rails 3.0.0の依存関係であるactionpack 3.0.0はrack 1.2.1との互換性を維持しているため、bundlerはそれをそのままにしておき、rack-cacheはrack 1.2.2との非互換性があっても動作し続けます。
最初にrails 3.0.0.rcへの依存関係を宣言したので、rails 3.0.0に更新する場合は、Gemfileをgem 'rails', '3.0.0'に更新し、以下を実行します。
$ bundle install
上記のように、bundle installコマンドは常に保守的な更新を実行し、Gemfileで明示的に変更していないgem(またはその依存関係)の更新を拒否します。これは、Gemfileでrack-cacheを変更しない場合、bundlerはそれを**とその依存関係**(rack)を単一の変更不可能なユニットとして扱うことを意味します。 rails 3.0.0がrack-cacheと互換性がない場合、bundlerはスナップショットされた依存関係(Gemfile.lock)と更新されたGemfileの間の競合を報告します。
Gemfileを更新し、システムに必要なすべての依存関係がすでに存在する場合、アプリケーションを起動すると、bundlerは透過的にGemfile.lockを更新します。たとえば、Gemfileにmysqlを追加し、システムにすでにインストールしている場合は、bundle installを実行せずにアプリケーションを起動できます。bundlerは「最後に正常に動作したことがわかっている」構成をGemfile.lockスナップショットに保持します。
これは、依存関係が最小限のgem(データベースドライバー、wirble、ruby-debug)を追加または更新する場合に役立ちます。依存関係が大きいgem(rails)や、多くのgemが依存しているgem(rack)を更新する場合は、おそらく失敗します。透過的な更新が失敗した場合、アプリケーションは起動に失敗し、bundlerはbundle installを実行するように指示するエラーを出力します。
Gemfileを変更せずに依存関係を更新したい場合があります。たとえば、rack-cacheの最新バージョンに更新したい場合があります。 Gemfileでrack-cacheの特定のバージョンを宣言していないため、定期的にrack-cacheの最新バージョンを取得したい場合があります。これを行うには、bundle updateコマンドを使用します
$ bundle update rack-cache
このコマンドは、rack-cacheとその依存関係を、Gemfileで許可されている最新バージョン(この場合は、利用可能な最新バージョン)に更新します。他の依存関係は変更しません。
ただし、必要に応じて他のgemの依存関係を更新します。たとえば、rack-cacheの最新バージョンがrack >= 1.2.2への依存関係を指定している場合、rackの更新をbundlerに要求していなくても、bundlerはrackを1.2.2に更新します。 bundlerが別のgemが依存しているgemを更新する必要がある場合、更新の完了後に通知されます。
Gemfileのすべてのgemを可能な限り最新バージョンに更新する場合は、以下を実行します。
$ bundle update
これは、Gemfile.lockを無視して、依存関係を最初から解決します。これを行う場合は、git reset --hardとテストスイートを念頭に置いてください。すべての依存関係を最初から解決すると、予期しない結果が生じる可能性があります.特に、最後に完全な更新を行ってから、依存しているサードパーティパッケージの多くが新しいバージョンをリリースしている場合に発生する可能性があります.