Kurze Erklärung: rbenv funktioniert, indem es sich in die Umgebung einfügt PATH
. Das Konzept ist einfach, aber der Teufel steckt im Detail; volle Schaufel unten.
Zuerst rbenv schafft Beilagen für alle Befehle ( ruby
, irb
, rake
, gem
usw.) über alle installierten Versionen von Ruby. Dieser Vorgang wird als Aufwärmen bezeichnet . Führen Sie jedes Mal, wenn Sie eine neue Version von Ruby installieren oder ein Juwel installieren, das einen Befehl bereitstellt, aus rbenv rehash
, um sicherzustellen, dass alle neuen Befehle abgeglichen werden.
Diese Shims befinden sich ( ~/.rbenv/shims
standardmäßig) in einem einzigen Verzeichnis . Um rbenv zu verwenden, müssen Sie nur das Shims-Verzeichnis an der Vorderseite Ihres PATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
Jedes Mal, wenn Sie ruby
über die Befehlszeile ausführen oder ein Skript ausführen, dessen Shebang lautet #!/usr/bin/env ruby
, wird Ihr Betriebssystem es ~/.rbenv/shims/ruby
zuerst finden und anstelle einer anderen ruby
ausführbaren Datei ausführen, die Sie möglicherweise installiert haben.
Jeder Shim ist ein winziges Bash-Skript, das wiederum ausgeführt wird rbenv exec
. Also mit rbenv auf Ihrem Weg irb
ist äquivalent zu rbenv exec irb
und ruby -e "puts 42"
äquivalent zu rbenv exec ruby -e "puts 42"
.
Der rbenv exec
Befehl ermittelt, welche Version von Ruby Sie verwenden möchten, und führt dann den entsprechenden Befehl für diese Version aus. Hier ist wie:
- Wenn die
RBENV_VERSION
Umgebungsvariable festgelegt ist, bestimmt ihr Wert die zu verwendende Ruby-Version.
- Wenn das aktuelle Arbeitsverzeichnis eine
.rbenv-version
Datei enthält, wird deren Inhalt zum Festlegen der RBENV_VERSION
Umgebungsvariablen verwendet.
- Wenn sich
.rbenv-version
im aktuellen Verzeichnis keine Datei befindet, durchsucht rbenv jedes übergeordnete Verzeichnis nach einer .rbenv-version
Datei, bis es das Stammverzeichnis Ihres Dateisystems erreicht. Wenn einer gefunden wird, wird sein Inhalt verwendet, um die RBENV_VERSION
Umgebungsvariable festzulegen.
- Wenn dies
RBENV_VERSION
immer noch nicht festgelegt ist, versucht rbenv, es anhand des Inhalts der ~/.rbenv/version
Datei festzulegen .
- Wenn nirgendwo eine Version angegeben ist, geht rbenv davon aus, dass Sie den Ruby "System" verwenden möchten - dh welche Version auch immer ausgeführt wird, wenn sich rbenv nicht in Ihrem Pfad befindet.
(Mit dem rbenv local
Befehl können Sie eine projektspezifische Ruby-Version festlegen, mit der eine .rbenv-version
Datei im aktuellen Verzeichnis erstellt wird. Ebenso rbenv global
ändert der Befehl die ~/.rbenv/version
Datei.)
Mit einer RBENV_VERSION
Umgebungsvariablen bewaffnet, fügt rbenv ~/.rbenv/versions/$RBENV_VERSION/bin
die Vorderseite Ihres hinzu PATH
und führt dann den Befehl und die Argumente aus, an die übergeben wird rbenv exec
. Voila!
Versuchen Sie RBENV_DEBUG=1
, einen Ruby-Befehl festzulegen und auszuführen, um genau zu sehen, was unter der Haube passiert . Jeder Bash-Befehl, den rbenv ausführt, wird in Ihr Terminal geschrieben.
Jetzt befasst sich rbenv nur noch mit dem Wechseln von Versionen, aber ein florierendes Ökosystem von Plugins hilft Ihnen dabei, alles zu tun, von der Installation von Ruby über die Einrichtung Ihrer Umgebung , die Verwaltung von "Gemsets" bis hin zur Automatisierungbundle exec
.
Ich bin mir nicht ganz sicher, was die IRC-Unterstützung mit dem Wechsel von Ruby-Versionen zu tun hat, und rbenv ist so konzipiert, dass es einfach und verständlich genug ist, um keine Unterstützung zu benötigen. Sollten Sie jemals Hilfe benötigen, sind der Issue-Tracker und Twitter nur ein paar Klicks entfernt.
Offenlegung: Ich bin der Autor von rbenv, ruby-build und rbenv-vars.
Ich habe einen ausführlichen Artikel geschrieben: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/
Der grundlegende Unterschied besteht darin, wo die Shell-Umgebung geändert wird:
Die Sache mit RVM ist außerdem, dass es viel mehr als nur das Verwalten von Rubinen abdeckt. Es hat viel mehr als jedes andere Tool (außer RVM und rbenv gibt es noch andere: https://twitter.com/#!/mpapis/ Status / 171714447910502401 )
Vergessen Sie nicht die sofortige Unterstützung, die Sie im IRC im Kanal "#rvm" auf den Freenode-Servern erhalten.
quelle
Um die hervorragenden Antworten oben zusammenzufassen, besteht der praktische Hauptunterschied zwischen RVM und rbenv darin, dass die Version von Ruby ausgewählt wird.
rbenv:
rbenv fügt am Anfang Ihres Pfades eine Unterlegscheibe hinzu, einen Befehl mit demselben Namen wie Ruby. Wenn Sie
ruby
an einer Befehlszeile eingeben, wird stattdessen der Shim ausgeführt (da er auch als "Ruby" bezeichnet wird und im Pfad an erster Stelle steht). Der Shim sucht nach einer Umgebungsvariablen oder.rbenv_version
-datei, um anzugeben, an welche Ruby-Version delegiert werden soll.RVM:
Mit RVM können Sie eine Version von Ruby direkt durch Aufrufen festlegen
rvm use
. Darüber hinaus wird dercd
Systembefehl überschrieben . Wenn Sie sichcd
in einem Ordner befinden, der eine.rvmrc
Datei enthält , wird der Code in der.rvmrc
Datei ausgeführt. Dies kann verwendet werden, um eine Ruby-Version oder alles andere festzulegen, was Sie möchten.Andere Unterschiede:
Es gibt natürlich noch andere Unterschiede. RVM hat Edelsteine sofort einsatzbereit, während rbenv nur ein wenig mehr Hacking erfordert (aber nicht viel). Beides sind funktionale Lösungen für das Problem.
quelle
Der Hauptunterschied scheint zu sein, wann und wie Rubin gewechselt wird . Ruby ist geschaltet:
RVM stützt sich auf den geänderten
cd
Befehl und die manuelle Auswahl von Ruby durchrvm use
. rbenv verwendet Wrapper oder "Shims" für alle grundlegenden Ruby-Befehle als Standardmechanismus für die Auswahl von Ruby. RVM erstellt Wrapper für grundlegende Befehlszeilen-Tools wie Edelstein, Rechen und Rubin. Sie werden beispielsweise in CronJobs verwendet (siehe http://rvm.io/integration/cron/ ), sind jedoch nicht der Standardmechanismus zum Wechseln der Ruby-Version.Somit wählen beide Methoden "automatisch" die richtige Ruby-Version aus, indem sie Befehle überschreiben und Wrapper verwenden. rvm überschreibt Shell-Befehle wie cd. rbenv überschreibt alle grundlegenden Ruby-Befehle wie Ruby, Irb, Rake und Gem.
quelle
Gibt Ihnen ungefähr:
Und es geht voran:
zu
$PATH
quelle