Bundler: Jak aktualizovat drahokamy pomocí Bundleru

Aktualizace závislosti

V určitém okamžiku můžete samozřejmě chtít aktualizovat verzi určité závislosti, na které vaše aplikace závisí. Například můžete chtít aktualizovat rails na 3.0.0 final. Důležité je, že jen proto, že aktualizujete jednu závislost, neznamená to, že chcete znovu vyřešit všechny závislostia používat nejnovější verzi všeho. V našem příkladu máte pouze třizávislosti, ale i v tomto případě může aktualizace všeho způsobit komplikace.

Pro ilustraci: gem rails 3.0.0.rc závisí na gemu actionpack 3.0.0.rc, který závisí na gemu rack ~> 1.2.1 (což znamená, že >= 1.2.1 a ). The rack-cache gem závisí narack >= 0.4. Předpokládejme, že finální gem rails 3.0.0 závisí také na rack ~> 1.2.1 a že od vydání gemu rails 3.0.0 tým Rack vydal gem rack 1.2.2.

Pokud naivně aktualizujeme všechny naše gemy, abychom aktualizovali Rails, získáme gem rack 1.2.2, který splňuje požadavky gemů rails 3.0.0 irack-cache. Nepožádali jsme však výslovně o aktualizacirack-cache, která nemusí být kompatibilní s rack 1.2.2 (ať už z jakéhokoli důvodu). A zatímco aktualizace z rack 1.2.1 na rack 1.2.2 pravděpodobně nic neporuší, mohou nastat podobné scénáře, které zahrnujídaleko větší skoky. (širší diskuse viz níže)

Aby se tomuto problému předešlo, nebude bundler při aktualizaci gemu aktualizovat závislost tohoto gemu, pokud na něm stále závisí jiný gem. V tomto příkladu, protožerack-cache stále závisí na rack, nebude bundler gemrack aktualizovat. Tím je zajištěno, že aktualizace rails nechtěně nerozbije rack-cache. Protože závislost rails 3.0.0actionpack 3.0.0 zůstává kompatibilní s rack 1.2.1, bundler ji ponechá na pokoji a rack-cache bude nadále fungovat i přes nekompatibilitu s rack 1.2.2.

Protože jste původně deklarovali závislost na rails 3.0.0.rc, pokud chceteaktualizovat na rails 3.0.0, jednoduše aktualizujte svůj Gemfile nagem 'rails', '3.0.0' a spusťte:

$ bundle install 

Jak je popsáno výše, příkaz bundle install vždy provede konzervativníaktualizaci a odmítne aktualizovat drahokamy (nebo jejich závislosti), které jste explicitněnezměnili v Gemfile. To znamená, že pokud ve svém Gemfile nezměníterack-cache, bude s ním **a jeho závislostmi** (rack) bundler zacházet jako s jedinou, nemodifikovatelnou jednotkou. Pokud by rails 3.0.0 byla nekompatibilní s rack-cache, bundler ohlásí konflikt mezi vašimi závislostmi na snímku (Gemfile.lock) a aktualizovanými Gemfile.

Pokud aktualizujete Gemfile a váš systém již obsahuje všechny potřebné závislosti, bundler transparentně aktualizuje Gemfile.lock při spuštění aplikace. Pokud například přidáte mysql do svého Gemfile a máte jej již nainstalovaný ve svém systému, můžete spustit svouaplikaci bez spuštění bundle install a bundler zachová „poslední známou dobrou“ konfiguraci do snímku Gemfile.lock.

To se může hodit při přidávání nebo aktualizaci drahokamů s minimálními závislostmi (databázové ovladače, wirble, ruby-debug). Pravděpodobně selže, pokud budeteaktualizovat gemy s významnými závislostmi (rails) nebo na kterých závisí mnoho gemů (rack). Pokud transparentní aktualizace selže, aplikace se nespustí a bundler vypíše chybu s pokynem ke spuštění bundle install.

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.