Sollte Gemfile.lock in .gitignore enthalten sein?


501

Ich bin ein bisschen neu in Bundler und den Dateien, die es generiert. Ich habe eine Kopie eines Git-Repos von GitHub, zu dem viele Leute beitragen, daher war ich überrascht, dass der Bundler eine Datei erstellt hat, die im Repo nicht vorhanden und nicht in der .gitignoreListe enthalten war.

Da ich es gegabelt habe, weiß ich, dass das Hinzufügen zum Repo nichts für das Haupt-Repo kaputt macht, aber wenn ich eine Pull-Anfrage mache, wird es ein Problem verursachen?

Sollte Gemfile.lockin das Repository aufgenommen werden?



2
Wenn Sie Ihren Weg hierher gefunden haben, weil Linux- und Windows-Boxen dasselbe Repo verwenden, lesen Sie die Antwort von Joe Yang. Zum Zeitpunkt meines Schreibens steht es an dritter Stelle. Siehe auch stackoverflow.com/questions/14034561/…
Peter Berg

Antworten:


549

Angenommen, Sie schreiben kein Rubygem, sollte sich Gemfile.lock in Ihrem Repository befinden. Es wird als Momentaufnahme aller benötigten Edelsteine ​​und ihrer Abhängigkeiten verwendet. Auf diese Weise muss der Bundler nicht bei jeder Bereitstellung usw. alle Gem-Abhängigkeiten neu berechnen.

Aus dem Kommentar von cowboycoded unten:

Wenn Sie an einem Edelstein arbeiten, checken Sie NICHT in Ihrem Gemfile.lock ein. Wenn Sie an einer Rails-App arbeiten, checken Sie Ihre Gemfile.lock ein.

Hier ist ein schöner Artikel, der erklärt, was die Sperrdatei ist.


88
Kommt darauf an, woran du arbeitest. Wenn Sie an einem Edelstein arbeiten, checken Sie NICHT in Ihrem Gemfile.lock ein. Wenn Sie an einer Rails-App arbeiten, checken Sie Ihre Gemfile.lock ein. Weitere Infos hier - yehudakatz.com/2010/12/16/…
Johnmcaliley

Danke für hilfreichen Artikel.
ashisrai_

1
Sie sollten das, was Cowboycoded gesagt hat, in Ihre Antwort zu Edelsteinen aufnehmen.
Aarona

Artikel Link benötigt eine neue href.
Ross

4
Bitte tu das nicht !! Behalte dein Gemfile.lock wo es ist! Wie hier und hier gesagt .
Ricardo Ruwer

50

Das eigentliche Problem tritt auf, wenn Sie an einer Open-Source-Rails-App arbeiten, für die ein konfigurierbarer Datenbankadapter erforderlich ist. Ich entwickle den Rails 3-Zweig von Fat Free CRM. Ich bevorzuge postgres, aber wir möchten, dass die Standarddatenbank mysql2 ist.

In diesem Fall muss Gemfile.lockimmer noch mit dem Standardsatz von Edelsteinen eingecheckt werden, aber ich muss Änderungen ignorieren, die ich auf meinem Computer vorgenommen habe. Um dies zu erreichen, renne ich:

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

und umzukehren:

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

Es ist auch nützlich, so etwas wie den folgenden Code in Ihren Code aufzunehmen Gemfile. Dadurch wird das entsprechende Datenbankadapter-Gem basierend auf Ihrer database.yml geladen.

# 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]
# -----------------------------------------------------------------------------

Ich kann nicht sagen, ob dies eine etablierte Best Practice ist oder nicht, aber es funktioniert gut für mich.


2
Sehr nützliche Informationen ... Ich bin mir nicht sicher, warum Sie nur 3 Punkte haben und eine weniger nützliche Antwort hat 50 Punkte. Oh ja, sieh dir die Datenstempel an. (Einer der großen Fehler von SO sind die unverhältnismäßigen Vorteile, die sich aus der Beantwortung kurz nach der Beantwortung der Frage ergeben.)
Bilderstürmer

1
@iconoclast: Ich bin wirklich froh, dass du gepostet hast, was du getan hast. Ich denke, dass viele Leute, die zu diesem Beitrag kommen, auch ich, vom Titel der Frage "geblendet" sind. Mir ist jetzt klar, dass meine Antwort nur einen bestimmten Anwendungsfall beantwortet und nicht unbedingt die richtige Antwort auf diese Frage. Ich werde in naher Zukunft daran arbeiten, es zu aktualisieren. Das OP hätte meine Antwort jedoch nicht als richtig markieren sollen, wenn sie seine Bedürfnisse nicht befriedigt hätte.
Williams

34

Meine Arbeitskollegen und ich haben unterschiedliche Gemfile.lock, da wir unterschiedliche Plattformen, Windows und Mac verwenden und unser Server Linux ist.

Wir beschließen, Gemfile.lock in Repo zu entfernen und Gemfile.lock.server in Git Repo zu erstellen, genau wie database.yml. Bevor wir es auf dem Server bereitstellen, kopieren wir Gemfile.lock.server mithilfe des Cap-Deployment-Hooks auf den Server nach Gemfile.lock


5
Ich habe eine App, die ich in OSX entwickle und dann auf einem Windows-Server bereitstellen muss. Das Verfolgen von Gemfile.lock mit git erwies sich als schlechte Idee, daher ging es in meine .gitignore-Datei. Viele Edelsteine ​​erfordern unterschiedliche Versionen für die verschiedenen Umgebungen. Idealerweise sollten Sie vermeiden, jemals in dieser Situation zu sein, aber ich hatte keine Wahl (verdammt noch mal, IT-Abteilung!)
Brad

11

Wenn Sie mit r-dub einverstanden sind, behalten Sie die Quellcodeverwaltung bei, aber für mich ist der eigentliche Vorteil folgender:

Zusammenarbeit in identischen Umgebungen (ohne Berücksichtigung der Windohs und Linux / Mac-Inhalte). Vor Gemfile.lock könnte der nächste Typ, der das Projekt installiert, alle möglichen verwirrenden Fehler sehen und sich selbst die Schuld geben, aber er war nur der Glückliche, der die nächste Version von Super Gem bekam und bestehende Abhängigkeiten aufbrach.

Schlimmer noch, dies geschah auf den Servern und es wurde eine nicht getestete Version abgerufen, es sei denn, dies wurde diszipliniert und die genaue Version installiert. Gemfile.lock macht dies explizit und zeigt Ihnen explizit an, dass Ihre Versionen unterschiedlich sind.

Hinweis: Denken Sie daran, Dinge zu gruppieren, wie: Entwicklung und: Test


11

Die Bundler-Dokumente behandeln auch diese Frage:

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

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

Siehe den Abschnitt "Einchecken Ihres Codes in die Versionskontrolle":

Nachdem Sie Ihre Anwendung für eine Weile entwickelt haben, checken Sie die Anwendung zusammen mit dem Snapshot Gemfile und Gemfile.lock ein. Jetzt enthält Ihr Repository eine Aufzeichnung der genauen Versionen aller Edelsteine, die Sie verwendet haben, als Sie das letzte Mal sicher waren, dass die Anwendung funktioniert hat. Denken Sie daran, dass Ihre Gemfile zwar nur drei Edelsteine ​​auflistet (mit unterschiedlichem Versionsgrad), Ihre Anwendung jedoch von Dutzenden von Edelsteinen abhängt, sobald Sie alle impliziten Anforderungen der Edelsteine ​​berücksichtigt haben, von denen Sie abhängig sind.

Dies ist wichtig: Gemfile.lock macht Ihre Anwendung zu einem einzigen Paket aus Ihrem eigenen Code und dem Code eines Drittanbieters, der ausgeführt wurde, als Sie das letzte Mal sicher waren, dass alles funktioniert hat. Die Angabe genauer Versionen des Codes von Drittanbietern, von denen Sie in Ihrer Gemfile abhängig sind, bietet nicht die gleiche Garantie, da Gems normalerweise eine Reihe von Versionen für ihre Abhängigkeiten deklarieren.

Wenn Sie das nächste Mal die Bundle-Installation auf demselben Computer ausführen, stellt Bundler fest, dass bereits alle erforderlichen Abhängigkeiten vorhanden sind, und überspringt den Installationsvorgang.

Überprüfen Sie nicht das .bundle-Verzeichnis oder eine der darin enthaltenen Dateien. Diese Dateien sind für jeden Computer spezifisch und werden verwendet, um die Installationsoptionen zwischen den Ausführungen des Befehls bundle install beizubehalten.

Wenn Sie das Bundle Pack ausgeführt haben, werden die für Ihr Bundle erforderlichen Edelsteine ​​(obwohl nicht die Git-Edelsteine) in den Anbieter / Cache heruntergeladen. Bundler kann ausgeführt werden, ohne eine Verbindung zum Internet (oder zum RubyGems-Server) herzustellen, wenn alle benötigten Edelsteine ​​in diesem Ordner vorhanden und bei Ihrer Quellcodeverwaltung eingecheckt sind. Dies ist ein optionaler Schritt und wird aufgrund der Vergrößerung Ihres Quellcodeverwaltungs-Repositorys nicht empfohlen.


4

Kein Gemfile.lock bedeutet:

  • Neue Mitwirkende können keine Tests durchführen, weil seltsame Dinge fehlschlagen, sodass sie keine Beiträge leisten oder fehlerhafte PRs erhalten ... schlechte erste Erfahrungen.
  • Sie können nicht zum alten Projekt zurückkehren und einen Fehler beheben, ohne das Projekt aktualisieren / neu schreiben zu müssen, wenn Sie Ihre lokale Gemfile.lock verloren haben

-> Checken Sie immer Gemfile.lock ein und lassen Sie Travis es löschen, wenn Sie besonders gründlich sein möchten. Https://grosser.it/2015/08/14/check-in-your-gemfile-lock/


3

Ein bisschen zu spät zur Party, aber die Antworten brauchten noch Zeit und ausländische Lesungen, um dieses Problem zu verstehen. Ich möchte also zusammenfassen, was ich über Gemfile.lock herausgefunden habe.

Wenn Sie eine Rails-App erstellen, verwenden Sie bestimmte Versionen von Edelsteinen auf Ihrem lokalen Computer. Wenn Sie Fehler im Produktionsmodus und in anderen Zweigen vermeiden möchten, müssen Sie diese eine Gemfile.lock-Datei überall verwenden und den Bundler anweisen bundle, Edelsteine ​​bei jeder Änderung neu zu erstellen .

Wenn Gemfile.locksich auf Ihrer Produktionsmaschine etwas geändert hat und Git Sie nicht zulässt git pull, sollten Sie schreiben git reset --hard, um diese Dateiänderung zu vermeiden, und git pullerneut schreiben .


Wenn sich eine Datei automatisch ändert, z. B. durch einen Erstellungsprozess, ist dies ein klares Zeichen dafür, dass sie nicht zur Versionskontrolle hinzugefügt werden sollte.
Thomas S.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.