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