Bundler:

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.

.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.