Gemの更新

依存性の更新

当然のことですが、あなたはアプリケーションの依存性のバージョンを、ある時点で更新したくなるでしょう。 例えば、Railsを3.0.0 finalへ更新したいとします。 重要なことですが、あなたが1つの依存性を更新するからといって、 全ての依存性の解決と全ての最新のバージョンの使用を望んでいるわけでは無いはずです。 ここでの例では、依存性は3つだけですが、それでもそれら全ての更新は複雑な問題を引き起こします。

具体的に説明しますとrails 3.0.0.rcのGemは、 actionpack 3.0.0.rcのGemに依存し、 このactionpack 3.0.0.rcrack ~> 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を更新した場合、 rails 3.0.0rack-cacheの両方の要件を満たすrack 1.2.2が取得されます。 しかしながら、私達はrack 1.2.2との依存性が無いかもしれない(何らかの理由で)rack-cacheの更新を、 特に要求したりはしませんでした。 また、rack 1.2.1rack 1.2.2へ更新される過程で、 何か不具合が起こるということはおそらく無いでしょうが、 似たようなケースで大幅なバージョンの更新を引き起こす可能性があります。

この問題を避けるために、BundlerはGemを更新する際に他のGemがまだそのGemに依存していれば、 その依存性の更新を行いません。 この例であれば、rack-cacheはまだrackに依存しているため、 Bundlerはrackの更新を行いません。 これは、railsの更新が、無意識のうちにrack-cacheを壊さないことを保証してくれます。 rails 3.0.0の依存性であるactionpack 3.0.0は、 rack 1.2.1との互換性が残されているため、 Bundlerはそれをそのままにし、rack-cacherack 1.2.2との互換性が無いという問題に直面したとしても、 動作し続けることが出来ます。

元々rails 3.0.0.rcの依存性を宣言していたため、 もしrails 3.0.0へ更新したいのであれば、 単純にGemfileのRailsの指定部分をgem 'rails', '3.0.0'に更新して実行します。

$ bundle install

上記で説明したように、bundle installコマンドは常に保守的な更新を行い、 あなたがGemfile内で明確に変更していないGem(または、それらの依存性)の更新を拒絶します。 これは、あなたがGemfile内でrack-cacheの編集をしていなければ、 Bundlerはそれ**とその依存性**(rack)を、変更できない1つの単位として取り扱います。 もし、rails 3.0.0rack-cacheと非互換であった場合、 Bundlerはスナップショットされた依存性(Gemfile.lock)と、 更新されたGemfileに衝突があることを報告してきます。

もし、あなたがGemfileを更新し、システムが必要とされる全ての依存性を既に持っている場合は、 Bundlerはアプリケーションを起動する際に、あなたに意識させること無くGemfile.lockの更新を行います。 例えば、Gemfilemysqlを追加し、 それが既にシステムにインストールされていた場合、 bundle installを実行すること無くアプリケーションを起動する事が可能で、 BundlerはGemfile.lockスナップショットへ、前回正常起動時("last known good")の構成を引き継ぎます。

これは、最小限の依存性を持つGem(データベースドライバ、wirbleruby-debug)の追加または更新を行う際に便利です。 もし多くの依存性を持つGem(例えば、rails)、 または多くのものに依存されているGem(例えば、rack)を更新しようとすると、 おそらくそれは失敗するでしょう。 もし、意識させないGemfile.lockの更新が失敗すれば、 アプリケーションの起動は失敗し、Bundlerはbundle installがエラーになったことを出力するでしょう。

Gemfileの変更無しにGemを更新

時に、Gemfileを編集すること無く、依存性を更新したいことがあるでしょう。 例えば、rack-cacheを最新バージョンへ更新するケースを考えてみましょう。 Gemfile内にrack-cacheの特定のバージョンを宣言しないことで、 定期的にrack-cacheの最新のバージョンを取得したいと考える事があるかもしれません。 これを行うために、あなたはbundle updateコマンドを使用することを考えるでしょう。

$ bundle update rack-cache

このコマンドは、rack-cacheとその依存性をGemfileで許される範囲で最新のバージョンに更新します。 (このケースでは、最新のバージョンが利用可能です。) その他の依存性の変更は行いません。

ただし、必要であれば他のGemの依存性を更新します。 例えば、もしrack-cacheの最新のバージョンがrack >= 1.2.2の依存性を指定する場合、 Bundlerはあなたがrackの更新を要求せずとも、rackを1.2.2に更新します。 もし、Bundlerが別のGemに依存するGemの更新をする必要があれば、 更新が完了した後にそれを知らせてきます。

もし、Gemfile内の各Gemを出来る限り最新のバージョンに更新したいのであれば、 下記を実行します。

$ bundle update

これは、Gemfile.lockを無視して、スクラッチから(ゼロから、何もない状態から)依存性の解決を行います。 もしこれを行う場合は、git reset --hardで確保し、一連のテストを行って下さい。(翻訳に自信なし) スクラッチからの全ての依存性を解決することは、 依存している多数のサードパーティのパッケージが、最後に完全に更新を行ってから新しいバージョンをリリースしているようであれば、 驚くべき結果をもたらす可能性があります。

 Back to top

© 2010 - 2017 STUDIO KINGDOM