Qual è la differenza tra Gemfile e Gemfile.lock in Ruby on Rails

Sono un principiante di Ruby on Rails e sto usando Rails 3.0.9.

Qual è la differenza tra Gemfile e Gemfile.lock in Rails?

Il Gemfile è dove specifichi quali gemme vuoi usare e ti consente di specificare quali versioni.

Il file Gemfile.lock è dove Bundler registra le esatte versioni che sono state installate. In questo modo, quando la stessa libreria / progetto viene caricata su un’altra macchina, l’ bundle install esaminerà Gemfile.lock e installerà le stesse identiche versioni, invece di usare semplicemente Gemfile e installare le versioni più recenti. (L’esecuzione di versioni diverse su macchine diverse potrebbe portare a test non funzionanti, ecc.) Non dovresti mai dover modificare direttamente il file di blocco.

Controlla lo scopo e la logica di Bundler , in particolare il controllo del codice nella sezione Controllo versione.

Di solito scriviamo le dipendenze in Gemfile come:

 gem "nokogiri", "~> 1.4.4" gem 'bcrypt-ruby', '~> 3.0.0' gem 'uglifier', '>= 1.2.3' .. 

Qui fondamentalmente dici: ” Voglio nokogiri fintanto che è maggiore della versione 1.4.4 “, ecc. Supponiamo ora di aver impostato il mio Gemfile 8 mesi fa e di aver impostato correttamente la mia app con questo requisito. 8 mesi fa la versione di nokogiri era 1.4.4 . Le mie app per rails funzionavano perfettamente senza problemi con questa versione.

Ora penso che sto provando a build con lo stesso Gemfile . Ma se guardiamo alle versioni di nokogiri vediamo che l’attuale versione stabile è cambiata in 1.4.9 . Ciò significa che se proviamo a creare, bundler installerà la versione 1.4.9 di nokogiri (supponiamo di non avere Gemfile.lock ).

Cosa significa ?

Come vedi se non hai Gemfile.lock ed esegui:

 bundle install 

quindi le gemme attualmente utilizzate possono essere diverse in qualsiasi momento . La tua app ha utilizzato la versione 1.4.4 e funziona 8 mesi fa senza problemi, ma se provi a crearla ora ottieni la versione 1.4.9 . Forse è rotto con l’ultima versione di nokogiri , la fantastica funzionalità che hai usato con 1.4.4 non è più disponibile, ecc.

Per evitare questo tipo di problema, si utilizza Gemfile.lock . In Gemfile.lock vengono scritte solo le esatte versioni e quindi solo queste verranno installate. Ciò significa che se si distribuisce l’app con Gemfile.lock , ogni macchina avrà le stesse gemme installate e, cosa più importante, avranno tutte la stessa versione . Questo ti darà uno stack di distribuzione stabile e comune.

Come viene creato Gemfile.lock?

Viene creato automaticamente con il primo:

 bundle install 

comando. Successivamente, ogni volta che esegui l’ bundle install , bundle prima cercherà Gemfile.lock e installerà le gemme specificate lì. È un’abitudine distribuire questo file tra i tuoi progetti per garantire coerenza e stabilità.

Come aggiornare Gemfile.lock?

Se sei soddisfatto della versione più recente delle tue app, puoi aggiornare Gemfile.lock . Basta riflettere le modifiche su Gemfile . Ciò significa cambiare le dipendenze con le nuove esatte versioni in Gemfile . Dopo quella corsa:

 bundle install 

Questo ti aggiornerà Gemfile.lock con la tua nuova versione di app.

Il Gemfile.lock

Quando esegui l’installazione di bundle, Bundler manterrà i nomi completi e le versioni di tutte le gemme che hai usato (incluse le dipendenze delle gemme specificate nel Gemfile (5)) in un file chiamato Gemfile.lock.

Bundler utilizza questo file in tutte le chiamate successive per l’installazione in bundle, il che garantisce che si utilizzi sempre lo stesso codice esatto, anche quando l’applicazione si sposta tra le macchine.

A causa del modo in cui funziona la risoluzione delle dipendenze, anche un cambiamento apparentemente piccolo (ad esempio, un aggiornamento a un punto di rilascio di una dipendenza di una gem nel tuo Gemfile (5)) può comportare gemme radicalmente differenti necessarie per soddisfare tutte le dipendenze.

Di conseguenza, DOVRESTI controllare il tuo Gemfile.lock nel controllo della versione. In caso contrario, ogni computer che controlla il repository (incluso il server di produzione) risolverà nuovamente tutte le dipendenze, il che comporterà l’uso di diverse versioni del codice di terze parti se una delle gemme nel Gemfile (5) o qualsiasi altra delle loro dipendenze sono state aggiornate.