2012-02-13 14 views
55

Ho notato che su rubygems.org molte gemme suggeriscono di specificarle per versione principale piuttosto che per versione esatta. Per esempio ...Devo specificare le esatte versioni nel mio Gemfile?

The haml-rails gem ...

gem "haml-rails", "~> 0.3.4" # "$ bundle install" will acquire the 
           # latest version before 1.0. 

Tuttavia, sulla base della Bundler docs sembrava a me come sarebbe meglio inchiodare la versione esatta come questo ...

gem "haml-rails", "0.3.4" 

Quindi c'è la tua gemma di rotaie e tutte le sue dipendenze non andranno alla deriva. Se verifichi il progetto su una macchina diversa poche settimane dopo e esegui $ bundle install avrai esattamente le stesse versioni di tutto ciò che hai specificato.

Ho visto i comunicati stampa interrompere le cose e ho pensato che parte dell'intera idea di Bundler fosse "Bundle.lock" tutte le versioni della gemma.

Ma su rubygems.org usano "~>" molto quindi forse mi manca qualcosa?

Qualsiasi chiarimento sarebbe molto utile per me nel comprendere Bundler e la gestione delle gemme.

risposta

51

Questo è lo scopo del file Gemfile.lock - in esecuzione bundle install con un file Gemfile.lock presente solo installazioni che utilizzano le dipendenze elencate qui; non ri-risolve il Gemfile. Per aggiornare le dipendenze/aggiornare le versioni gem, devi quindi fare esplicitamente un bundle update, che aggiornerà il tuo file Gemfile.lock.

Se non ci fosse un Gemfile.lock, l'implementazione del codice in produzione sarebbe un grosso problema perché, come si menziona, le versioni delle dipendenze e delle gemme potrebbero cambiare.

In breve, si dovrebbe essere generalmente sicuri utilizzando l'operatore di limitazione della versione pessimistica (~>) come consigliato da rubygems.org. Assicurati di eseguire nuovamente i test dopo aver eseguito uno bundle update per assicurarti che non si interrompa nulla.

C'è uno nice article di Yehuda Katz che ha un po 'più di informazioni su Gemfile.lock.

+0

OK, quindi le gemme rimangono nelle versioni consolidate registrate in Gemfile.lock. Quindi qual è lo scopo di aggiungere "~>"? Quanto è vantaggioso? – Ethan

+2

@ethan RubyGems ha un [doc] (http://rubygems.rubyforge.org/rubygems-update/Gem/Version.html) che lo spiega (vedere la sezione "Prevenire la catastrofe della versione"). L'essenza di esso è che consente solo di aumentare l'ultimo numero nel numero di versione (ad es. '~> 1.0.5' consente l'aggiornamento alla versione 1.0.9999, ma mai a 1.1.x). Il meccanismo è per consentire l'aggiornamento delle gemme, ma senza introdurre incompatibilità che potrebbero violare le cose (presuppone che le gemme stiano seguendo la politica "Rational Versioning" che collega i contorni). –

+1

@ethan Ecco un paio di altri link sul sito RubyDocs in merito a "[operatore pessimistico] (http://docs.rubygems.org/read/chapter/16#page74)" (~>) e [versioning razionale] (http : //docs.rubygems.org/read/chapter/7). –

5

Direi sicuramente di usare i numeri di versione esatta. Probabilmente puoi sempre limitarti ad una versione principale, o non specificare mai alcuna versione, e stare bene, ma se vuoi davvero quel livello di controllo a grana fine e avere il 100% di fiducia nel tuo programma quando viene eseguito su altre macchine, usa i numeri di versione esatti.

Sono stato in situazioni in cui il numero esatto della versione non è stato specificato, e quando io o qualcun altro ha fatto un bundle install, il progetto si è rotto perché è andato a una versione più recente. Questo può essere particolarmente negativo durante la distribuzione in produzione.

Bundler fa blocca le specifiche del tuo gioiello, ma se stai dicendo di usare solo una versione principale, allora la blocca. Quindi sa solo "Oh la versione è bloccata a> 0.1" o qualunque cosa, ma non "Oh la versione è bloccata nello specifico a 0.1.2.3".

+8

Se 'Gemfile.lock' è presente, Bundler infatti conosce la versione specifica da installare (motivo per cui' Gemfile.lock' deve essere memorizzato nel repository accanto a 'Gemfile'). – mipadi

+1

Fare un 'aggiornamento bundle ' anche se può finire per aggiornare molto più di quanto pensassi, anche se il 'Gemfile.lock' è presente, e quella può essere una situazione pericolosa e appiccicosa. – MrDanA

+0

Sono d'accordo con la raccomandazione degli stessi RubyGems su questo problema: basta usare il vincolo pessimistico (~>). Questo incoraggia l'intera comunità ad accumulare versioni di versioni semantiche, il che è una buona cosa, e tra questo e le funzionalità di stabilità integrate di Gemfile.lock le tue basi dovrebbero essere più che coperte. – user456584

Problemi correlati