Bundler: Sådan opdaterer du gems med Bundler

Opdatering af en afhængighed

Naturligvis kan du på et tidspunkt ønske at opdatere versionen af en bestemt afhængighed, som din applikation er afhængig af. Det kan f.eks. være, at du ønsker at opdatererails til 3.0.0 final. Det er vigtigt, at bare fordi du opdaterer en afhængighed, betyder det ikke, at du ønsker at genopløse alle dine afhængigheder og bruge den nyeste version af alting. I vores eksempel har du kun tre afhængigheder, men selv i dette tilfælde kan det give komplikationer at opdatere alt.

Til illustration afhænger rails 3.0.0.rc-perlen af actionpack 3.0.0.rc-perlen, som afhænger af rack ~> 1.2.1 (hvilket betyder, at >= 1.2.1 og ). The rack-cache-perlen afhænger afrack >= 0.4. Lad os antage, at den endelige rails 3.0.0-perle også afhænger af rack ~> 1.2.1, og at Rack-teamet siden udgivelsen af rails 3.0.0 har udgivet rack 1.2.2.

Hvis vi naivt opdaterer alle vores perler for at opdatere Rails, får vi rack 1.2.2, som opfylder kravene i både rails 3.0.0 og rack-cache. Vi har dog ikke specifikt bedt om at opdatererack-cache, som måske ikke er kompatibel med rack 1.2.2 (uanset årsagen). Og selv om en opdatering fra rack 1.2.1 til rack 1.2.2 sandsynligvis ikke vil ødelægge noget, kan der opstå lignende scenarier, som involverer langt større spring. (se nedenfor for en større diskussion)

For at undgå dette problem vil bundler, når du opdaterer en perle, ikke opdatere en afhængighed af denne perle, hvis en anden perle stadig er afhængig af den. I dette eksempel, darack-cache stadig er afhængig af rack, vil bundler ikke opdatererack-perlen. Dette sikrer, at opdatering af rails ikke utilsigtet ødelægger rack-cache. Da rails 3.0.0s afhængighedactionpack 3.0.0 fortsat er kompatibel med rack 1.2.1, lader bundler den stå alene, og rack-cache fortsætter med at fungere, selv i lyset af en inkompatibilitet med rack 1.2.2.

Da du oprindeligt erklærede en afhængighed af rails 3.0.0.rc, hvis du ønskerat opdatere til rails 3.0.0, skal du blot opdatere din Gemfile tilgem 'rails', '3.0.0' og køre:

$ bundle install 

Som beskrevet ovenfor, udfører kommandoen bundle install altid en konservativopdatering og nægter at opdatere perler (eller deres afhængigheder), som du ikke udtrykkeligt har ændret i Gemfile. Det betyder, at hvis du ikke ændrerrack-cache i din Gemfile, vil bundler behandle den **og densafhængigheder** (rack) som en enkelt, ikke-modificerbar enhed. Hvis rails 3.0.0 var inkompatibel med rack-cache, vil bundler rapportere en konflikt mellem dine snapshottede afhængigheder (Gemfile.lock) og din opdaterede Gemfile.

Hvis du opdaterer din Gemfile, og dit system allerede har alle de nødvendige afhængigheder, vil bundler på gennemsigtig vis opdatere Gemfile.lock, når du starter dit program. Hvis du f.eks. tilføjer mysql til din Gemfile og allerede har installeret det i dit system, kan du starte dit program uden at køre bundle install, og bundler vil bevare den “senest kendte gode” konfiguration til Gemfile.lock-snapshotet.

Dette kan være praktisk, når du tilføjer eller opdaterer perler med minimale afhængigheder (databasedrivers, wirble, ruby-debug). Det vil sandsynligvis mislykkes, hvis duopdaterer perler med betydelige afhængigheder (rails), eller som mange perler er afhængige af (rack). Hvis en gennemsigtig opdatering mislykkes, vil din applikation ikke kunne starte op, og bundler vil udskrive en fejl, som instruerer dig om at køre bundle install.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.