もちろん、ある時点で、アプリケーションが依存している特定の依存関係のバージョンを更新したい場合があります。たとえば、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
とテストスイートを念頭に置いてください。すべての依存関係を最初から解決すると、予期しない結果が生じる可能性があります.特に、最後に完全な更新を行ってから、依存しているサードパーティパッケージの多くが新しいバージョンをリリースしている場合に発生する可能性があります.