Updating a Dependency
Oczywiście, w pewnym momencie możesz chcieć zaktualizować wersję konkretnej zależności, na której opiera się twoja aplikacja. Na przykład, możesz chcieć zaktualizowaćrails
do 3.0.0
final. Co ważne, tylko dlatego, że aktualizujesz jedną zależność, nie oznacza to, że chcesz ponownie rozwiązać wszystkie swoje zależności i użyć najnowszej wersji wszystkiego. W naszym przykładzie masz tylko trzy zależności, ale nawet w tym przypadku aktualizacja wszystkiego może spowodować komplikacje.
Aby zilustrować, rails 3.0.0.rc
gem zależy od actionpack 3.0.0.rc
gem, który zależy od rack ~> 1.2.1
(co oznacza >= 1.2.1
i ). The
rack-cache
gem zależy odrack >= 0.4
. Załóżmy, że rails 3.0.0
końcowy gem również zależy od rack ~> 1.2.1
, i że od czasu wydania rails 3.0.0
, zespół Rack wydał rack 1.2.2
.
Jeśli naiwnie zaktualizujemy wszystkie nasze gemy w celu aktualizacji Rails, otrzymamy rack 1.2.2
, który spełnia wymagania zarówno rails 3.0.0
jak irack-cache
. Jednakże, nie poprosiliśmy specjalnie o aktualizację rack-cache
, która może nie być kompatybilna z rack 1.2.2
(z jakiegokolwiek powodu). I chociaż aktualizacja z rack 1.2.1
do rack 1.2.2
prawdopodobnie niczego nie zepsuje, mogą się zdarzyć podobne scenariusze, które obejmują znacznie większe skoki. (zobacz poniżej dla szerszej dyskusji)
Aby uniknąć tego problemu, kiedy aktualizujesz gem, bundler nie zaktualizuje zależności tego gema, jeśli inny gem nadal od niego zależy. W tym przykładzie, ponieważrack-cache
nadal zależy od rack
, bundler nie zaktualizuje klejnoturack
. Zapewnia to, że aktualizacja rails
nie spowoduje przypadkowego uszkodzenia rack-cache
. Ponieważ zależność rails 3.0.0
actionpack 3.0.0
pozostaje zgodna z rack 1.2.1
, bundler pozostawia ją w spokoju, a rack-cache
nadal działa nawet w obliczu braku kompatybilności z rack 1.2.2
.
Ponieważ pierwotnie zadeklarowałeś zależność od rails 3.0.0.rc
, jeśli chcesz zaktualizować do rails 3.0.0
, po prostu zaktualizuj swój Gemfile
dogem 'rails', '3.0.0'
i uruchom:
$ bundle install
Jak opisano powyżej, polecenie bundle install
zawsze wykonuje konserwatywną aktualizację, odmawiając aktualizacji klejnotów (lub ich zależności), których nie zmieniłeś jawnie w Gemfile
. Oznacza to, że jeśli nie zmodyfikujesz rack-cache
w swoim Gemfile
, bundler będzie traktował go **i jego zależności** (rack
) jako pojedynczą, niemodyfikowalną jednostkę. Jeśli rails 3.0.0
był niekompatybilny z rack-cache
, bundler zgłosi konflikt między twoimi zrzutami zależności (Gemfile.lock
) a twoim zaktualizowanym Gemfile
.
Jeśli zaktualizujesz swój Gemfile
, a twój system ma już wszystkie potrzebne zależności, bundler przezroczyście zaktualizuje Gemfile.lock
podczas uruchamiania aplikacji. Na przykład, jeśli dodasz mysql
do swojejGemfile
i już zainstalowałeś go w systemie, możesz uruchomić swoją aplikację bez uruchamiania bundle install
, a bundler zachowa „ostatnią znaną dobrą” konfigurację do Gemfile.lock
snapshota.
To może się przydać, gdy dodajesz lub aktualizujesz klejnoty z minimalnymi zależnościami (databasedrivers, wirble
, ruby-debug
). Prawdopodobnie nie powiedzie się, jeśli aktualizujesz klejnoty o znaczących zależnościach (rails
), lub takie, od których zależy wiele klejnotów (rack
). Jeśli przejrzysta aktualizacja nie powiedzie się, twoja aplikacja nie uruchomi się, a bundler wypisze błąd, instruując cię, abyś uruchomił bundle install
.
.