Ich habe festgestellt, dass auf rubygems.org viele Edelsteine vorschlagen, dass Sie sie eher nach Hauptversion als nach exakter Version angeben. Zum Beispiel...
gem "haml-rails", "~> 0.3.4" # "$ bundle install" will acquire the
# latest version before 1.0.
Basierend auf den Bundler-Dokumenten klang es für mich jedoch so, als wäre es besser, die genaue Version wie diese festzunageln ...
gem "haml-rails", "0.3.4"
Es gibt also Ihren Haml-Rails-Edelstein und all seine Abhängigkeiten werden nicht vorwärts driften. Wenn Sie das Projekt einige Wochen später auf einem anderen Computer auschecken und ausführen $ bundle install
, haben Sie genau die gleichen Versionen von allem, was Sie angegeben haben.
Ich habe gesehen, wie Punktveröffentlichungen Sachen kaputt machten, und ich dachte, ein Teil der ganzen Idee von Bundler war es, Bundle.lock
alle Ihre Edelsteinversionen zu " " ".
Aber auf rubygems.org verwenden sie häufig "~>", also fehlt mir vielleicht etwas?
Jede Klarstellung wäre für mich sehr hilfreich, um das Bundler- und Edelsteinmanagement zu verstehen.
Antworten:
Dies ist der Zweck der Datei Gemfile.lock. Die Ausführung
bundle install
mit einer vorhandenen Datei Gemfile.lock erfolgt nur unter Verwendung der dort aufgeführten Abhängigkeiten. Das Gemfile wird nicht erneut aufgelöst. Um Abhängigkeiten zu aktualisieren / Gem-Versionen zu aktualisieren, müssen Sie explizit abundle update
ausführen, wodurch Ihre Gemfile.lock-Datei aktualisiert wird.Wenn es kein Gemfile.lock gäbe, wäre die Bereitstellung von Code für die Produktion ein großes Problem, da sich, wie Sie bereits erwähnt haben, die Abhängigkeiten und Gem-Versionen ändern könnten.
Kurz gesagt, Sie sollten im Allgemeinen sicher sein, wenn Sie den pessimistischen Versionsbeschränkungsoperator (
~>
) verwenden, wie von rubygems.org empfohlen. Stellen Sie einfach sicher, dass Sie Ihre Tests nach dem Ausführen erneut ausführenbundle update
, um sicherzustellen, dass nichts kaputt geht.Es gibt einen schönen Artikel von Yehuda Katz, der ein bisschen mehr Infos zu Gemfile.lock enthält.
quelle
TL; DR
Ja, verwenden Sie pessimistisches Sperren (
~>
) und geben Sie eine semantische Version bis zum Patch (Major.minor.patch
) für alle Ihre Edelsteine an!Diskussion
Ich bin überrascht über die Unklarheit in dieser Frage, selbst "Branchenexperten" sagten mir neulich, dass
Gemfile.lock
es Edelsteinversionen gibt. Falsch!Sie möchten Ihre
Gemfile
so organisieren , dass Sie jederzeit laufenbundle update
können, ohne das Risiko einzugehen, alles zu beschädigen. Um dies zu erreichen:Geben Sie eine Patch-Level-Version für alle Ihre Edelsteine mit pessimistischer Sperre an. Auf diese Weise können
bundle update
Sie Korrekturen vornehmen, aber keine Änderungen vornehmen.Geben Sie a
ref
für Edelsteine von git anDer einzige Nachteil dieses Setups ist, dass Sie die Version manuell hochfahren müssen, wenn eine süße neue Moll- / Dur-Version für einen Edelstein herauskommt.
Warnszenario
Überlegen Sie, was passiert, wenn Sie Ihre Edelsteine nicht sperren.
Sie haben eine freigeschaltete
gem "rails"
in Ihrer Gemfile und die Version inGemfile.lock
ist4.1.16
. Sie codieren mit und irgendwann tun Sie abundle update
. Jetzt springt Ihre Rails-Version zu5.2.0
(vorausgesetzt, ein anderes Juwel verhindert dies nicht) und alles bricht.Tun Sie sich selbst einen Gefallen und lassen Sie dies für keinen Edelstein zu!
Ein Beispiel Gemfile
# lock that bundler if (version = Gem::Version.new(Bundler::VERSION)) < Gem::Version.new('1.16.3') abort "Bundler version >= 1.16.3 is required. You are running #{version}" end source "http://rubygems.org" # specify explicit ref for git repos gem "entity_validator", git: "https://github.com/plataformatec/devise", ref: "acc45c5a44c45b252ccba65fd169a45af73ff369" # "2018-08-02" # consider hard-lock on gems you do not want to change one bit gem "rails", "5.1.5" # pessimistic lock on your common gems gem "newrelic_rpm", "~> 4.8.0" gem "puma", "~> 3.12.0" group :test do gem "simplecov", "~> 0.16.1", require: false end
Eine Konzession
Wenn Sie sicher sind, dass Ihre Tests Fehler erkennen, die durch Änderungen der Edelsteinversion verursacht wurden, können Sie versuchen, Edelsteine mit pessimistischer Sperre in der Nebenversion und nicht im Patch zu verwenden.
Dadurch kann die Edelsteinversion innerhalb der angegebenen Hauptversion erhöht werden, jedoch niemals in die nächste.
gem "puma", "~> 3.12"
quelle
You want to organize your Gemfile in such a manner that you can run bundle update any time without risking breaking everything
. Nein, das ist nicht das Ziel. Es hört sich so an, als ob Sie den Unterschied zwischenbundle update
und möglicherweise nicht verstehenbundle install
.update
aktualisiert dieGemfile.lock
und ändert die von Ihnen verwendeten Versionen. Sie möchten jederzeit laufenbundle install
können, ohne das Risiko einzugehen, alles zu beschädigen. So wie es ist, zwingen Sie die, dasGemfile
zu tun, was dasGemfile.lock
tun soll.Gemfile.lock
nicht in der Tat gem Versionen beibehalten. Bis Sie (natürlich) beschließen, es mit zu überschreibenbundle update
(was im Grunde wie gesagt istbundle overwrite_my_locked_gem_versions
).Gemfile.lock
Entwickler , nur weil es eine Datei mit allen genauen Versionen gibt, keine Gem-Versionen angeben müssenGemfile
(die Idee, die sperrt) 'pflegt' Versionen). Das ist falsch. Entwickler 'pflegen' Versionen, indem sie sie angebenGemfile
und gelegentlichbundle update
ausführen.Ich würde definitiv sagen, verwenden Sie die genauen Versionsnummern. Sie können es wahrscheinlich immer nur auf eine Hauptversion beschränken oder niemals eine Version angeben und in Ordnung sein, aber wenn Sie wirklich diese fein abgestimmte Kontrolle wollen und 100% Vertrauen in Ihr Programm haben möchten, wenn es auf anderen Computern ausgeführt wird, Verwenden Sie die genauen Versionsnummern.
Ich war in Situationen, in denen die genaue Versionsnummer nicht angegeben wurde, und als ich oder jemand anderes eine tat
bundle install
, brach das Projekt, weil es auf eine neuere Version ging. Dies kann bei der Bereitstellung in der Produktion besonders schlimm sein.Bündler tut Schloss in Ihrer gem Spezifikation, aber wenn Sie es doch sagen , eine Major - Release nur verwenden, es sperrt dann , dass in. So einfach ist weiß „Oh die Version in bei> 0,1 ist gesperrt“ oder was auch immer, aber nicht „Oh Die Version ist speziell bei 0.1.2.3 "gesperrt.
quelle
Gemfile.lock
vorhanden, weiß Bundler tatsächlich, welche spezifische Version installiert werden muss (weshalbGemfile.lock
sie neben dem Repo gespeichert werden sollteGemfile
).bundle update <gem>
obwohl kann am Ende zu aktualisieren Weg mehr , als Sie gedacht, auch wenn dieGemfile.lock
vorhanden ist, und dass eine gefährliche und schwierige Situation sein kann.Gemfile
. Dies ist der Zweck vonGemfile.lock
. Wenn Sie sichGemfile.lock
zur Quellcodeverwaltung verpflichten,bundle install
erhält jemand, der dies ausführt und tut , genau die gleichen Versionen von Edelsteinen wie Sie. Das Festlegen einer genauen Version in den verhindertGemfile
dies,bundle update gem_you_want_to_update
während Sie mit pessimistischen Versionen (~>
) oder gar keiner Versionbundle update gem_you_want_to_update
die neueste (kleinere) Version ausführen und