2010-11-11 15 views
430

Sono una sorta di novità del bundler e dei file che genera. Ho una copia di un repository git di GitHub a cui molti utenti hanno contribuito, quindi sono stato sorpreso di scoprire che bundler ha creato un file che non esisteva nel repository e che non era incluso nell'elenco .gitignore.Dovrebbe essere incluso Gemfile.lock in .gitignore?

Dal momento che l'ho biforcato, so che aggiungerlo al repository non interromperà nulla per il repository principale, ma se faccio una richiesta di pull, causerà un problema?

È necessario includere Gemfile.lock nel repository?

+0

correlati: http://stackoverflow.com/questions/14034561/should-gemfile-lock-be-committed-to-source-control-on-windows – ripper234

+2

Se hai trovato la tua qui perché hai Linux e Windows che condividono lo stesso repository, vedi la risposta di Joe Yang. Al momento della mia scrittura questo è classificato al terzo posto. Vedi anche http://stackoverflow.com/questions/14034561/should-gemfile-lock-be-committed-to-source-control-on-windows –

risposta

476

Supponendo che non si scriva un rubygem, Gemfile.lock deve essere nel repository. È usato come un'istantanea di tutte le gemme necessarie e delle loro dipendenze. In questo modo, bundler non deve ricalcolare tutte le dipendenze della gemma ogni volta che viene distribuito, ecc.

dal commento di cowboycoded.

Se si sta lavorando su una gemma, poi fare NON check-in vostro Gemfile.lock.

Ecco un bel article spiegando ciò che il file di blocco è.

+78

Dipende da cosa stai lavorando. Se stai lavorando su una gemma, NON entrare nel tuo Gemfile.lock. Se stai lavorando su un'app Rails, allora controlla il tuo Gemfile.lock. Maggiori informazioni qui - http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/ – johnmcaliley

+0

Ottimo punto. – rwilliams

+0

Thx per un articolo utile. – a5his

11

accordo con r-dub, tenerlo in controllo del codice sorgente, ma per me, il vero vantaggio è questo:

collaborazione in ambienti identici (ignorando i Windohs e Linux roba/Mac). Prima di Gemfile.lock, il prossimo a installare il progetto poteva vedere tutti i tipi di errori confusi, incolpando se stesso, ma era solo quel ragazzo fortunato che ha ottenuto la prossima versione di super-gioi, rompendo le dipendenze esistenti.

Peggio, questo è successo sui server, ottenendo la versione non testata a meno di essere disciplinato e installare la versione esatta. Gemfile.lock lo rende esplicito e ti dirà esplicitamente che le tue versioni sono diverse.

Nota: ricordarsi di roba gruppo, come: sviluppo e: prova

46

Il vero problema si verifica quando si sta lavorando su un'applicazione open-source Rails che ha bisogno di avere un adattatore di database configurabile. Sto sviluppando il ramo Rails 3 di Fat Free CRM. La mia preferenza è postgres, ma vogliamo che il database predefinito sia mysql2.

In questo caso, il numero di serie Gemfile.lock deve ancora essere archiviato con il set predefinito di gem, ma è necessario ignorare le modifiche apportate alla mia macchina. Per fare questo, ho eseguito:

git update-index --assume-unchanged Gemfile.lock 

e per invertire:

git update-index --no-assume-unchanged Gemfile.lock 

E 'anche utile includere qualcosa come il seguente codice nel tuo Gemfile. Questo carica la gemma dell'adattatore del database appropriato, in base al tuo database.yml.

# Loads the database adapter gem based on config/database.yml (Default: mysql2) 
# ----------------------------------------------------------------------------- 
db_gems = {"mysql2"  => ["mysql2", ">= 0.2.6"], 
      "postgresql" => ["pg",  ">= 0.9.0"], 
      "sqlite3" => ["sqlite3"]} 
adapter = if File.exists?(db_config = File.join(File.dirname(__FILE__),"config","database.yml")) 
    db = YAML.load_file(db_config) 
    # Fetch the first configured adapter from config/database.yml 
    (db["production"] || db["development"] || db["test"])["adapter"] 
else 
    "mysql2" 
end 
gem *db_gems[adapter] 
# ----------------------------------------------------------------------------- 

Non posso dire se questa è una pratica consolidata o no, ma funziona bene per me.

+1

+1 grazie per questo input. – DJTripleThreat

+2

Informazioni molto utili ... non so perché hai solo 3 punti e una risposta meno utile ha 50 punti. Oh, sì, guarda i datestamp. (Uno dei grandi fallimenti di SO è i benefici sproporzionati che si accumulano nel rispondere subito dopo la domanda.) – iconoclast

+1

@iconoclast: Sono davvero contento che tu abbia postato ciò che hai fatto. Penso che molte persone che vengono a questo post, incluso me stesso, siano "accecate" dal titolo della domanda. Mi rendo conto ora che la mia risposta risponde solo a un caso d'uso specifico e non necessariamente la risposta giusta a questa domanda. Lavorerò all'aggiornamento nel prossimo futuro. Ciò detto, l'OP non avrebbe dovuto contrassegnare la mia risposta come corretta se non soddisfacesse i suoi bisogni. – rwilliams

31

I miei compagni di lavoro e io ho Gemfile diverso.bloccare, perché usiamo diverse piattaforme, Windows e Mac, e il nostro server è Linux.

Decidiamo di rimuovere Gemfile.lock in repository e creare Gemfile.lock.server in git repo, proprio come database.yml. Poi prima di distribuirlo nel server, copiamo Gemfile.lock.server a Gemfile.lock sul server utilizzando il gancio tappo Deploy

+5

Ho un'app che sviluppo in OSX e quindi devo distribuire su un server Windows. Il monitoraggio di Gemfile.lock con git si è rivelato una cattiva idea, quindi è stato inserito nel mio file .gitignore. Molte gemme richiedono versioni diverse per i diversi ambienti. Idealmente dovresti evitare di trovarti in questa situazione, ma non ho avuto scelta (dannazione al dipartimento I.!) – brad

9

La documentazione Bundler rispondere a questa domanda così:

ORIGINALE: http://gembundler.com/v1.3/rationale.html

EDIT: http://web.archive.org/web/20160309170442/http://bundler.io/v1.3/rationale.html

Vedere la sezione chiamata "Verifica il tuo Codice in Version Control":

Dopo aver sviluppato l'applicazione per un wh ile, controlla l'applicazione insieme all'istantanea Gemfile e Gemfile.lock. Ora, il tuo repository ha un record delle esatte versioni di tutte le gemme che hai usato l'ultima volta che sai per certo che l'applicazione funzionava. Tieni presente che mentre il tuo file Gemfile elenca solo tre gemme (con diversi gradi di rigore della versione), l'applicazione dipende da su dozzine di gemme, una volta presi in considerazione tutti i requisiti impliciti delle gemme da cui dipendi .

Questo è importante: il Gemfile.lock rende l'applicazione una sola pacchetto sia il proprio codice e il codice di terze parti si correva l'ultima volta si sa per certo che tutto ha funzionato. Specificare le esatte versioni del codice di terze parti da cui si dipende nel tuo Gemfile sarebbe non fornire la stessa garanzia, perché le gemme di solito dichiarano un intervallo di versioni per le loro dipendenze.

La prossima volta che si esegue bundle install sulla stessa macchina, bundler sarà vedere che ha già tutte le dipendenze si ha bisogno, e saltare il processo di installazione .

Non controllare la directory .bundle o alcuno dei file al suo interno. Questi file sono specifici per ogni macchina particolare e sono usati per le opzioni di installazione permanente tra le esecuzioni del comando di installazione del pacchetto.

Se è stato eseguito bundle pack, le gemme (anche se non le gemme git) richieste dal pacchetto verranno scaricate nel fornitore/cache. Bundler può essere eseguito senza connessione a Internet (o al server RubyGems) se tutte le gemme necessarie sono presenti in quella cartella e registrate in il controllo del codice sorgente. Questo è un passaggio facoltativo e non consigliato, a causa dell'aumento delle dimensioni del repository di controllo del codice sorgente.

+0

Bella spiegazione, grazie. – akostadinov

3

Un po 'in ritardo alla festa, ma le risposte mi hanno richiesto tempo e letture straniere per capire questo problema. Quindi voglio riassumere quello che ho trovato su Gemfile.lock.

Quando si crea un'app per rails, si utilizzano determinate versioni di gem nel computer locale. Se vuoi evitare errori nella modalità di produzione e in altri rami, devi usare quel file Gemfile.lock ovunque e dire a bundler di bundle per ricostruire gemme ogni volta che cambia.

Se Gemfile.lock è cambiato sulla macchina di produzione e Git non farvi git pull, si dovrebbe scrivere git reset --hard per evitare che la modifica di file e scrivere git pull di nuovo.

+0

Se un file cambia automaticamente, ad es. da un processo di compilazione, è un chiaro segno che non dovrebbe essere aggiunto al controllo di versione. –

3

No Gemfile.lock significa:

  • nuovi collaboratori non possono eseguire i test perché le cose strane non riescono, in modo da non contribuire o ottenere PR mancanza ... brutta prima esperienza.
  • non si può tornare al vecchio progetto anno ascia e correggere un bug senza dover aggiornare/riscrivere il progetto, se avete perso il vostro Gemfile.lock locale

-> Verificare sempre in Gemfile.lock, rendono Travis cancellare se si vuole essere ancora più accurata https://grosser.it/2015/08/14/check-in-your-gemfile-lock/

Problemi correlati