Gemの更新
依存性の更新
当然のことですが、あなたはアプリケーションの依存性のバージョンを、ある時点で更新したくなるでしょう。 例えば、Railsを3.0.0 finalへ更新したいとします。 重要なことですが、あなたが1つの依存性を更新するからといって、 全ての依存性の解決と全ての最新のバージョンの使用を望んでいるわけでは無いはずです。 ここでの例では、依存性は3つだけですが、それでもそれら全ての更新は複雑な問題を引き起こします。
具体的に説明しますとrails 3.0.0.rcのGemは、
actionpack 3.0.0.rcのGemに依存し、
このactionpack 3.0.0.rcは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を更新した場合、
rails 3.0.0とrack-cacheの両方の要件を満たすrack 1.2.2が取得されます。
しかしながら、私達はrack 1.2.2との依存性が無いかもしれない(何らかの理由で)rack-cacheの更新を、
特に要求したりはしませんでした。
また、rack 1.2.1がrack 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-cacheがrack 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.0がrack-cacheと非互換であった場合、
Bundlerはスナップショットされた依存性(Gemfile.lock)と、
更新されたGemfileに衝突があることを報告してきます。
もし、あなたがGemfileを更新し、システムが必要とされる全ての依存性を既に持っている場合は、
Bundlerはアプリケーションを起動する際に、あなたに意識させること無くGemfile.lockの更新を行います。
例えば、Gemfileにmysqlを追加し、
それが既にシステムにインストールされていた場合、
bundle installを実行すること無くアプリケーションを起動する事が可能で、
BundlerはGemfile.lockスナップショットへ、前回正常起動時("last known good")の構成を引き継ぎます。
これは、最小限の依存性を持つGem(データベースドライバ、wirble、ruby-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で確保し、一連のテストを行って下さい。(翻訳に自信なし)
スクラッチからの全ての依存性を解決することは、
依存している多数のサードパーティのパッケージが、最後に完全に更新を行ってから新しいバージョンをリリースしているようであれば、
驚くべき結果をもたらす可能性があります。
© 2010 - 2017 STUDIO KINGDOM