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