Updating a Dependency
もちろん、ある時点で、アプリケーションが依存している特定の依存性のバージョンを更新したいと思うかもしれません。 例えば、rails
を 3.0.0
final に更新したいと思うかもしれません。 重要なのは、ある依存関係を更新したからといって、すべての依存関係を再解決し、すべての最新バージョンを使いたいとは限らないということです。 この例では、3 つの依存関係しかありませんが、この場合でも、すべてを更新すると複雑になります。
例示すると、rails 3.0.0.rc
gem は actionpack 3.0.0.rc
gem に依存しており、それは rack ~> 1.2.1
に依存しています (これは >= 1.2.1
と ). The
rack-cache
gem は rack >= 0.4
に依存しているということです)。 rails 3.0.0
最終版の gem も rack ~> 1.2.1
に依存しており、rails 3.0.0
のリリース以降に Rack チームが rack 1.2.2
をリリースしたと仮定しましょう。
Railsをアップデートするためにナイーブにすべての gem をアップデートすると、rails 3.0.0
と rack-cache
の両方の要件を満たす rack 1.2.2
を取得することができるのです。 しかし、特に rack-cache
のアップデートを要求していないため、rack 1.2.2
と互換性がない可能性があります (理由はどうあれ)。 また、rack 1.2.1
から rack 1.2.2
への更新はおそらく何も壊さないでしょうが、より大きなジャンプを伴う同様のシナリオが起こり得ます。 (詳細については、以下を参照してください)
この問題を回避するために、gem を更新するとき、bundler はその gem の依存関係を更新せず、他の gem がまだそれに依存している場合、その 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
を透過的に更新します。 たとえば、mysql
を Gemfile
に追加し、すでにシステムにインストールされている場合、bundle install
を実行せずにアプリケーションを起動でき、bundler は “last known good” 設定を Gemfile.lock
スナップショットに持続させます。 重要な依存関係を持つ gems (rails
) や、多くの gems が依存しているもの (rack
) を更新する場合は、おそらく失敗します。 透過的な更新に失敗すると、アプリケーションの起動に失敗し、bundler は bundle install
.
を実行するように指示するエラーを出力します。