バンドラーです。 Bundler で gems を更新する方法

Updating a Dependency

もちろん、ある時点で、アプリケーションが依存している特定の依存性のバージョンを更新したいと思うかもしれません。 例えば、rails3.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.0rack-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.0rack 1.2.1 と互換性があるので、bundler はそれをそのままにし、rack-cacherack 1.2.2 との非互換性に直面しても動作しつづけます。

最初に rails 3.0.0.rc への依存を宣言したので、rails 3.0.0 に更新したい場合は、単に Gemfilegem 'rails', '3.0.0' に更新して次のように実行します:

$ bundle install 

前述のように、bundle install コマンドは常に保守的に更新を行い、Gemfile で明確に変更されていない gem (やその依存) は更新しないことにしています。 つまり、Gemfilerack-cache を変更しなかった場合、bundler はそれを ** およびその依存関係** (rack) を単一の、変更できないユニットとして扱います。 rails 3.0.0rack-cache と互換性がない場合、bundler はスナップショットされた依存関係 (Gemfile.lock) と更新された Gemfile との間の競合を報告します。

Gemfile を更新し、システムがすでにすべての依存関係を持つ場合、アプリケーション起動時に bundler が Gemfile.lock を透過的に更新します。 たとえば、mysqlGemfile に追加し、すでにシステムにインストールされている場合、bundle install を実行せずにアプリケーションを起動でき、bundler は “last known good” 設定を Gemfile.lock スナップショットに持続させます。 重要な依存関係を持つ gems (rails) や、多くの gems が依存しているもの (rack) を更新する場合は、おそらく失敗します。 透過的な更新に失敗すると、アプリケーションの起動に失敗し、bundler は bundle install.

を実行するように指示するエラーを出力します。

コメントを残す

メールアドレスが公開されることはありません。