Függőség frissítése
Egy bizonyos ponton természetesen előfordulhat, hogy frissíteni szeretné egy bizonyos függőség verzióját, amelyre az alkalmazása támaszkodik. Például frissítheti arails
függőséget 3.0.0
véglegesre. Fontos, hogy csak azért, mert egy függőséget frissítesz, nem jelenti azt, hogy az összes függőségedet újra fel kell oldanod, és mindenből a legújabb verziót kell használnod. Példánkban csak három függőséged van, de még ebben az esetben is bonyodalmakat okozhat, ha mindent frissítesz.
Az illusztrációhoz a rails 3.0.0.rc
gem függ a actionpack 3.0.0.rc
gem-től, ami függ a rack ~> 1.2.1
-től (ami azt jelenti, hogy >= 1.2.1
és ). The
rack-cache
gem függ a rack >= 0.4
-től. Tegyük fel, hogy a rails 3.0.0
végleges gem szintén függ a rack ~> 1.2.1
-től, és hogy a rails 3.0.0
kiadása óta a Rack csapat kiadta a rack 1.2.2
-t.
Ha naivan frissítjük az összes gemünket a Rails frissítése érdekében, akkor rack 1.2.2
-t kapunk, ami kielégíti mind a rails 3.0.0
, mind arack-cache
követelményeit. Azonban nem kértük kifejezetten arack-cache
frissítését, ami nem biztos, hogy kompatibilis a rack 1.2.2
-el (bármilyen okból). És míg egy frissítés rack 1.2.1
-ről rack 1.2.2
-re valószínűleg nem fog semmit sem tönkretenni, hasonló forgatókönyvek előfordulhatnak, amelyek sokkal nagyobb ugrásokat foglalnak magukban. (lásd alább a bővebb kifejtést)
A probléma elkerülése érdekében, amikor frissítesz egy drágakövet, a bundler nem frissíti annak a drágakőnek a függőségét, ha egy másik drágakő még mindig függ tőle. Ebben a példában, mivelrack-cache
még mindig függ rack
-től, a bundler nem fogja frissíteni arack
gem-et. Ez biztosítja, hogy a rails
frissítése nem teszi tönkre véletlenül a rack-cache
-at. Mivel rails 3.0.0
függőségeactionpack 3.0.0
továbbra is kompatibilis rack 1.2.1
-el, a bundler békén hagyja, és rack-cache
továbbra is működik, még a rack 1.2.2
-el való inkompatibilitás ellenére is.
Mivel eredetileg deklaráltad a rails 3.0.0.rc
függőségét, ha frissíteni akarsz a rails 3.0.0
-re, egyszerűen frissítsd a Gemfile
-ötgem 'rails', '3.0.0'
-ra és futtasd:
$ bundle install
A fent leírtak szerint a bundle install
parancs mindig konzervatív frissítést végez, nem hajlandó frissíteni azokat a gemeket (vagy azok függőségeit), amelyeket nem változtattál meg kifejezetten a Gemfile
-ben. Ez azt jelenti, hogy ha nem módosítodrack-cache
a Gemfile
-ben, a bundler egyetlen, nem módosítható egységként fogja kezelni **és függőségeit** (rack
). Ha a rails 3.0.0
inkompatibilis volt a rack-cache
-zal, a bundler konfliktust fog jelenteni a pillanatnyi függőségek (Gemfile.lock
) és a frissített Gemfile
között.
Ha frissíti a Gemfile
-öt, és a rendszere már rendelkezik az összes szükséges függőséggel, a bundler átláthatóan frissíti a Gemfile.lock
-et, amikor elindítja az alkalmazást. Például, ha a mysql
-t hozzáadod a Gemfile
-hez, és már telepítetted a rendszeredbe, akkor a bundle install
futtatása nélkül is elindíthatod az alkalmazásodat, és a bundler az “utolsó ismert jó” konfigurációt a Gemfile.lock
pillanatfelvételen fogja tárolni.
Ez jól jöhet, amikor minimális függőséggel rendelkező drágaköveket adsz hozzá vagy frissítesz (adatbázishajtók, wirble
, ruby-debug
). Valószínűleg nem fog sikerülni, ha jelentős függőségű drágaköveket frissítesz (rails
), vagy ha sok drágakő függ tőle (rack
). Ha az átlátható frissítés sikertelen, az alkalmazásod nem fog elindulni, és a bundler kiír egy hibát, amely arra utasít, hogy futtasd a bundle install
.
.