Ich bin ein Anfänger von Ruby on Rails und verwende Rails 3.0.9.
Was ist der Unterschied zwischen Gemfile
und Gemfile.lock
in Rails?
quelle
Ich bin ein Anfänger von Ruby on Rails und verwende Rails 3.0.9.
Was ist der Unterschied zwischen Gemfile
und Gemfile.lock
in Rails?
Das Gemfile
ist , wo Sie die Edelsteine die Sie verwenden möchten angeben, und können Sie angeben , welche Versionen.
In der Gemfile.lock
Datei zeichnet Bundler die genauen Versionen auf, die installiert wurden. Wenn dieselbe Bibliothek / dasselbe Projekt auf einen anderen Computer geladen bundle install
wird, werden beim Ausführen auf diese Weise Gemfile.lock
genau dieselben Versionen angezeigt und installiert, anstatt nur Gemfile
die neuesten Versionen zu verwenden und zu installieren. (Das Ausführen verschiedener Versionen auf verschiedenen Computern kann zu fehlerhaften Tests usw. führen.) Sie sollten die Sperrdatei niemals direkt bearbeiten müssen.
Lesen Sie Bundlers Zweck und Begründung , insbesondere den Abschnitt Einchecken Ihres Codes in die Versionskontrolle.
Gemfile.lock
enthält das in einigen Fällen "offene" Versionen (z. B.rails (4.0.0)
erforderlichbundler (>= 1.3.0, < 2.0)
), was zu Problemen führt. Irgendeine Idee, wie man diese "offenen" Abhängigkeiten vermeidet?Normalerweise schreiben wir Abhängigkeiten in Gemfile wie folgt:
Hier sagen Sie im Grunde: " Ich möchte Nokiaogiri, solange es größer als Version 1.4.4 ist " usw. Nehmen wir nun an, ich habe meine App vor
Gemfile
8 Monaten eingerichtet und meine App mit dieser Anforderung erfolgreich eingerichtet. Vor 8 Monaten war die Nokiaogiri-Version 1.4.4 . Meine Rails-Apps liefen mit dieser Version problemlos.Jetzt denke ich versuche mit dem gleichen zu bauen
Gemfile
. Wenn wir uns jedoch die Nokia-Versionen ansehen, sehen wir, dass sich die aktuelle stabile Version auf 1.4.9 geändert hat . Das heißt, wenn wir versuchen zu bauen, installiert Bundler Version 1.4.9 von Nokiaogiri (nehmen wir an, wir haben keineGemfile.lock
).Was heißt das ?
Wie Sie sehen, wenn Sie keine haben
Gemfile.lock
und laufen:dann können die aktuell verwendeten Edelsteine jederzeit unterschiedlich sein . Ihre App hat die Version 1.4.4 verwendet und funktioniert vor 8 Monaten ohne Probleme. Wenn Sie jedoch versuchen, sie jetzt zu erstellen, erhalten Sie die Version 1.4.9 . Vielleicht ist es mit der neuesten Version von kaputt.
nokogiri
Die großartige Funktion, die Sie mit 1.4.4 verwendet haben, ist nicht mehr verfügbar.Um diese Art von Problem zu verhindern,
Gemfile.lock
wird verwendet. Es werdenGemfile.lock
nur die genauen Versionen geschrieben und somit werden nur diese installiert. Das heißt, wenn Sie Ihre App mit a verteilenGemfile.lock
, werden auf jedem Computer dieselben Edelsteine installiert, und vor allem erhalten alle dieselbe Version . Dadurch erhalten Sie einen stabilen und gemeinsamen Bereitstellungsstapel.Wie wird Gemfile.lock erstellt?
Es wird automatisch mit dem ersten erstellt:
Befehl. Danach sucht das
bundle install
Bundle bei jeder Ausführung zuerst nachGemfile.lock
den dort angegebenen Edelsteinen und installiert sie. Es ist eine Gewohnheit, diese Datei auf Ihre Projekte zu verteilen, um Konsistenz und Stabilität zu gewährleisten.Wie aktualisiere ich Gemfile.lock?
Wenn Sie mit der neuesten Version Ihrer Apps zufrieden sind, können Sie diese aktualisieren
Gemfile.lock
. Reflektieren Sie einfach Ihre Änderungen anGemfile
. Das heißt, ändern Sie die Abhängigkeiten auf die neuen exakten Versionen inGemfile
. Nach diesem Lauf:Dadurch werden Sie
Gemfile.lock
mit Ihrer neuesten Version von Apps aktualisiert .quelle
nokogiri ~> 1.4.4
würde nicht zulassen1.5.3
, installiert zu werden; maximal erlaubt wäre1.4.x
wox>=4
(für nokogiri wäre das1.4.7
). Der~>
Operator bedeutet, dass nur die letzte Ziffer des verwendeten Edelsteins "größer" als die angegebene Version sein kann. ZBfoo ~> a.b.c.d
bedeutet , dass jede Version vonfoo
in Ordnung ist, solange es noch abc {etwas} ist, wo {etwas}>=
d. Siehe auch verwandte Fragegem "nokogiri", "~> 1.4.4"
angeben, indem Sie sie in der Gem-Datei verwenden. Warum konnte der Bundler diese Version nicht einfach verwenden? Liegt es daran, dass die neuesten Versionen des Edelsteins standardmäßig absichtlich installiert werden sollen?~> 1.4.4
entspricht>= 1.4.4 and < 1.5
. Siehe bundler.io/v1.5/gemfile.html . Für eine genaue Version verwenden Sie einfachgem 'foo', '1.4.4'
.bundle install
das überprüft wird,Gemfile
auch wenn es eine gibt,Gemfile.lock
und erzwingt neue Einschränkungen fürGemfile.lock
?Das Gemfile.lock
Wenn Sie die Bundle-Installation ausführen, speichert Bundler die vollständigen Namen und Versionen aller von Ihnen verwendeten Gems (einschließlich der Abhängigkeiten der in Gemfile (5) angegebenen Gems) in einer Datei namens Gemfile.lock.
Bundler verwendet diese Datei in allen nachfolgenden Aufrufen, um die Installation zu bündeln. Dies garantiert, dass Sie immer denselben exakten Code verwenden, auch wenn sich Ihre Anwendung über mehrere Computer hinweg bewegt.
Aufgrund der Funktionsweise der Abhängigkeitsauflösung kann selbst eine scheinbar kleine Änderung (z. B. eine Aktualisierung einer Punktfreigabe einer Abhängigkeit eines Edelsteins in Ihrer Gemfile (5)) dazu führen, dass radikal unterschiedliche Edelsteine erforderlich sind, um alle Abhängigkeiten zu erfüllen.
Daher sollten Sie Ihr Gemfile.lock in die Versionskontrolle einchecken. Wenn Sie dies nicht tun, löst jeder Computer, der Ihr Repository auscheckt (einschließlich Ihres Produktionsservers), alle Abhängigkeiten erneut auf, was dazu führt, dass unterschiedliche Versionen von Code von Drittanbietern verwendet werden, wenn eines der Gems in Gemfile (5) oder eines der Gems vorhanden ist ihrer Abhängigkeiten wurden aktualisiert.
quelle