Bundler: Come aggiornare le gemme con Bundler

Aggiornare una dipendenza

Ovviamente, ad un certo punto, potresti voler aggiornare la versione di una particolare dipendenza su cui si basa la tua applicazione. Per esempio, potresti voler aggiornarerails a 3.0.0 finale. Importante, solo perché stai aggiornando una dipendenza, non significa che vuoi ri-risolvere tutte le tue dipendenze e usare l’ultima versione di tutto. Nel nostro esempio, avete solo tre dipendenze, ma anche in questo caso, aggiornare tutto può causare complicazioni.

Per illustrare, la gemma rails 3.0.0.rc dipende da actionpack 3.0.0.rc gem, che dipende da rack ~> 1.2.1 (che significa >= 1.2.1 e ). The rack-cache gem dipende darack >= 0.4. Supponiamo che la gemma finale rails 3.0.0 dipenda anche da rack ~> 1.2.1, e che dal rilascio di rails 3.0.0, il team Rack abbia rilasciato rack 1.2.2.

Se ingenuamente aggiorniamo tutte le nostre gemme per aggiornare Rails, otterremo rack 1.2.2, che soddisfa i requisiti di entrambe rails 3.0.0 erack-cache. Tuttavia, non abbiamo chiesto specificamente di aggiornarerack-cache, che potrebbe non essere compatibile con rack 1.2.2 (per qualsiasi motivo). E mentre un aggiornamento da rack 1.2.1 a rack 1.2.2 probabilmente non romperà nulla, possono accadere scenari simili che coinvolgono salti molto più grandi. (vedi sotto per una discussione più ampia)

Per evitare questo problema, quando si aggiorna una gemma, bundler non aggiornerà la dipendenza di quella gemma se un’altra gemma dipende ancora da essa. In questo esempio, poichérack-cache dipende ancora da rack, bundler non aggiornerà la gemmarack. Questo assicura che l’aggiornamento di rails non rompa inavvertitamente rack-cache. Poiché la dipendenza di rails 3.0.0actionpack 3.0.0 rimane compatibile con rack 1.2.1, bundler la lascia stare, e rack-cache continua a funzionare anche di fronte all’incompatibilità con rack 1.2.2.

Siccome originariamente hai dichiarato una dipendenza da rails 3.0.0.rc, se vuoi aggiornare a rails 3.0.0, aggiorna semplicemente il tuo Gemfile agem 'rails', '3.0.0' ed esegui:

$ bundle install 

Come descritto sopra, il comando bundle install fa sempre un aggiornamento conservativo, rifiutando di aggiornare le gemme (o le loro dipendenze) che non hai esplicitamente modificato nel Gemfile. Questo significa che se non modificaterack-cache nel vostro Gemfile, bundler lo tratterà **e le sue dipendenze** (rack) come una singola unità non modificabile. Se rails 3.0.0 fosse incompatibile con rack-cache, bundler segnalerà un conflitto tra le tue dipendenze istantanee (Gemfile.lock) e il tuo Gemfile aggiornato.

Se aggiorni il tuo Gemfile, e il tuo sistema ha già tutte le dipendenze necessarie, bundler aggiornerà in modo trasparente il Gemfile.lock quando avvii la tua applicazione. Per esempio, se aggiungi mysql al tuo Gemfile, e l’hai già installato nel tuo sistema, puoi avviare la tua applicazione senza eseguire bundle install, e bundler persisterà la configurazione “last known good” nello snapshot Gemfile.lock.

Questo può essere utile quando aggiungi o aggiorni gemme con dipendenze minime (databasedrivers, wirble, ruby-debug). Probabilmente fallirà se si aggiornano gemme con dipendenze significative (rails), o da cui dipendono molte gemme (rack). Se un aggiornamento trasparente fallisce, la vostra applicazione non si avvierà, e bundler stamperà un errore indicandovi di eseguire bundle install.

.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.