Bundler: How to update gems with Bundler

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.0actionpack 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.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.