2015-10-04 21 views
10

Mein neuestes Rails-Projekt ist mehr oder weniger und Experiment für mich, viele Dinge zu brechen und dabei zu lernen.Ist es eine schlechte Praxis Ruby Version in Gemfile und .ruby-Version Dotfile aufzulisten?

ruby '2.2.3'

Und ich auch ein .ruby-version dotfile im Projekt haben, mit folgendem Inhalt:: Ich habe die neueste Version von Ruby in meinem gemfile angegeben

2.2.3

Andere als die offensichtliche Duplikation, was ist daran falsch? Was ist der Zweck beider Konventionen? Wenn ich nur eine Konvention haben sollte, um meine Ruby-Version aufzulisten, warum sollte ich eine (Gemfile) über die andere haben (dotfile)?

Ist es vollkommen in Ordnung, beide Konventionen in einem Projekt zu haben?

Ich werde der einzige Betreuer dieses experimentellen Projekts sein, und ich denke nicht, dass es ein Problem sein wird, diese eine subtile Duplizierung aufrechtzuerhalten. Ich habe nicht die Absicht, Ruby für dieses Projekt aufzurüsten, und wenn ich es tue, werde ich nicht daran denken, es an beiden Orten zu tun. Abgesehen von diesem Detail vermeide ich solche Doppelungen in den Codebasen meiner Anwendungen.

+0

Ich glaube, Sie brauchen nicht zu Ruby-Version in Ihrem Gemfile überhaupt angeben . –

+3

Afaik '.ruby-Version' legt die Ruby-Version für RVM oder rbenv fest, aber Heroku nimmt zum Beispiel die Ruby-Version aus der Gemdatei ([source] (https://devcenter.heroku.com/articles/ruby-versions)) . – spickermann

+0

Danke @spickermann, das klingt nach einer guten Idee, beides zu haben. – Todd

Antwort

12

Sie wurden jeweils von verschiedenen Teams zu unterschiedlichen Zeiten entwickelt und werden von unterschiedlicher Software verwendet.

Eine Rubin-Version in der Gemfile ist eine feature in bundler.

Da das Gemfile hauptsächlich nur von Bundler verwendet wird, wird es hauptsächlich nur Dinge bewirken, wenn Sie den Bundler ausführen - mit bundle exec oder Software (wie Rails), die Bundler automatisch für Sie auslöst. Der Effekt besteht einfach darin, Fehler zu machen und die Ausführung zu verweigern, wenn Sie nicht die angegebene Version von ruby ​​verwenden. Es ist eine Voraussetzung - unter diesem Rubin laufen, oder ich werde einen Fehler werfen, der Sie warnt, dass Sie unter dem falschen Rubin laufen.

Allerdings heroku also pays attention zu der Version in der Gemfile angegeben, und wird unter dieser Version ausgeführt werden. Heroku entschied sich, das Feature auch in Bundler zu verwenden. Aber die meisten anderen Programme auf Ihrer Workstation oder sogar travis verwenden diese Konvention nicht. (Mit Travis können Sie Ihre .travis.yml-ENV bearbeiten, um die Ruby-Version für die Verwendung anzugeben.)

Das Feature in bundler wurde Manager 2012

in Bündler 1.2 im August eingeführt

Die .ruby-version Datei wurde zuerst von rvm eingeführt, dem ersten Ruby-Version. Wenn Sie rvm verwenden und in eine Projektverknüpfung mit einer Datei .ruby-version wechseln, wechselt rvm automatisch Ihre Shell zur Verwendung der angegebenen Ruby-Version.

Ich bin mir nicht sicher, wenn rvm diese Funktion eingeführt, aber ich denke, vor der Gemfile "Ruby" -Funktion.

Da rvm es eingeführt hat, haben andere Ruby Version Switching-Software wie rbenv und chruby es auch übernommen, um das gleiche zu tun - automatisch zu der Ruby-Version wechseln, wenn Sie cd in das Verzeichnis angegeben. Obwohl ich denke, mit Rbenv und Chruby kann beides ein optionales Feature sein.

Sie waren also verschiedene Funktionen, die von verschiedenen Softwarepaketen zu verschiedenen Zeiten eingeführt und unterstützt wurden, wobei etwas anderes gemacht wurde.

Ich stimme zu, es wäre ärgerlich, beide zu verwalten und sie synchron zu halten.

Sie sind beide tatsächlich optional, Sie müssen keines verwenden. Abgesehen davon, dass du vielleicht die Gemfile-Ruby-Spezifikation für Heroku verwenden musst, um ihm mitzuteilen, welchen Ruby er ausführen soll.

Ich persönlich auch nicht verwenden. Aber wenn Sie in verschiedenen Ruby-Versionen in verschiedenen Projekten arbeiten müssen und es praktisch ist, wenn Ihr Ruby-Versionsverwalter (rvm, rbenv oder chruby) automatisch auf die richtige projektspezifische Ruby-Version umschaltet, könnte .ruby-version nützlich sein.

Abgesehen von Heroku-Zwecken ist die Auflistung von Ruby im Gemfile meistens nur dazu da, um Fehler zu vermeiden, zum Beispiel beim Deployment. Oder eine interne automatisierte Bereitstellungs- oder CI-Umgebung könnte sie ähnlich wie Heroku verwenden, oder vielleicht haben andere Cloud-Bereitstellungsstapel sie übernommen. Ich denke, viele haben es nicht so nützlich gefunden - auch dieses würde ich nicht verwenden, bis Sie ein Problem sehen oder sehen, dass es löst. Eine Unannehmlichkeit, die manche Leute haben, wenn sie Ruby-Versionen in Gemfile auflisten, ist, dass neue Rubine immer rauskommen und du alle deine Gemfiles ständig aktualisieren musst.

Im Allgemeinen waren die letzten Jahre der Ruby-Veröffentlichungen sehr abwärtskompatibel, was die Notwendigkeit einschränkt, eine genaue Version von Ruby zu verwenden, der neueste Code wird auf dem neuesten Ruby laufen, selbst wenn Es wurde ursprünglich für einen älteren geschrieben.

Ich glaube nicht, beide Funktionen können Sie eine Reihe von Ruby-Versionen angeben, wie 2.2.* oder was Sie haben.

Mit beiden/beiden Funktionen, verwenden Sie sie nur, wenn Sie sie brauchen oder sie nützlich finden, müssen Sie auch nicht, und es ist in Ordnung (wenn ärgerlich), beide zu verwenden, wenn Sie beide benötigen.

Da ein Gemfile Live-Ruby-Code ist, könnten Sie theoretisch Ihr Gemfile Ihre .ruby-version-Datei lesen lassen und diesen Wert automatisch als Gemfile ruby verwenden. Wenn du beide verwenden willst, und "wiederhole dich nicht" damit. Ich weiß nicht, ob das üblich ist, ich habe nur daran gedacht. Aber es sollte gut funktionieren.

+0

Vielen Dank für die gründliche Antwort. – Todd

+0

Auch ich habe eine potenziell verwandte Frage hier: http://stackoverflow.com/questions/34905560/is-it-a-bad-practice-to-have-both-a-rvmrc-and-a-ruby-Version -in-a-ruby-project, solltest du mal wieder so eine weisheit geben :) – Todd

6

Ich denke, es ist besser zu vermeiden, die gleichen Informationen zweimal aufzulisten, es sei denn, es gibt einen guten Grund - d. H. Halten Sie es trocken.

können Sie speichern die Ruby-Version in ".ruby-Version", und dann in der Gemfile etwas tun, wie folgt aus:

ruby File.open('.ruby-version', 'rb') { |f| f.read.chomp } 
+2

Das ist so TROCKEN es scheuert. Sie müssen die Version in der '.ruby-Version 'trotzdem manuell ändern. Das Ersetzen mehrerer Instanzen ist mit Ihrem bevorzugten Editor trivial. – Dennis

+0

@Dennis, das ist der ganze Sinn von DRY. Jemand könnte vergessen, eine Suche zu ersetzen. Dieser Code sagt Ihnen, dass ich die gleiche Version wie in .ruby-Version verwenden möchte. – PhilT

+2

Dies ist ein bisschen prägnanter und gleichbedeutend: ruby ​​File.read ('. Ruby-Version', Modus: 'rb').chomp – Empact