Ruby-Äquivalent zu virtualenv?


165

Gibt es etwas Ähnliches wie das Python-Dienstprogramm virtualenv ?

Grundsätzlich können Sie Python-Pakete in einer Sandbox-Umgebung installieren. easy_install djangoGehen Sie also nicht in Ihr systemweites Verzeichnis für Site-Pakete, sondern in das von virtualenv erstellte Verzeichnis.

Beispielsweise:

$ virtualenv test
New python executable in test/bin/python
Installing setuptools...cd .........done.
$ cd test/
$ source bin/activate
(test)$ easy_install tvnamer
Searching for tvnamer
Best match: tvnamer 0.5.1
Processing tvnamer-0.5.1-py2.5.egg
Adding tvnamer 0.5.1 to easy-install.pth file
Installing tvnamer script to /Users/dbr/test/bin

Using /Library/Python/2.5/site-packages/tvnamer-0.5.1-py2.5.egg
Processing dependencies for tvnamer
Finished processing dependencies for tvnamer
(test)$ which tvnamer 
/Users/dbr/test/bin/tvnamer

Gibt es so etwas für RubyGems?

Antworten:


84

RVM arbeitet näher an der Funktionsweise von virtualenv, da Sie damit verschiedene Ruby-Versionen und deren Edelsteine ​​usw. sandboxen können.


5
Versuchte sowohl Sandbox als auch RVM und denke, dass RVM eine viel bessere Lösung ist.
ivanjovanovic

9
ivanjovanovic. Warum fanden Sie RVM besser als Sandbox?
Pwan

67

Weder Sandbox, RVM noch rbenv verwalten die Versionen der Gem-Abhängigkeiten Ihrer App. Das Werkzeug dafür ist Bundler .

  • Verwenden Sie eine Gemfile als Abhängigkeitsdeklaration Ihrer Anwendung
  • Verwenden Sie bundle installdiese Option, um explizite Versionen dieser Abhängigkeiten an einem isolierten Speicherort zu installieren
  • Verwenden Sie bundle execdiese Option, um Ihre Anwendung auszuführen

6
Ich persönlich denke auch, dass die Leute rbenv / rvm überbeanspruchen. Wenn Sie nicht unbedingt mehrere isolierte Ruby-Versionen auf demselben Computer benötigen - und wahrscheinlich auch nicht -, verwenden Sie rbenv / rvm nicht. Ihre "Abstraktion" ist nicht kostenlos; Ich garantiere Ihnen, dass Sie irgendwann Zeit damit verbringen müssen, sie zu debuggen. Mein Rat: Installieren Sie Ruby einfach mit dem Paketmanager Ihres Betriebssystems. Das Neueste ist das Größte.
pje

6
Vermisse ich etwas Bundler versucht weiterhin, Pakete standardmäßig systemweit zu installieren.
Detly

6
Isolierte Umgebungen sind in einem modernen Arbeitsablauf so gut wie nicht optional. Wenn Sie sich auf System Ruby und System Package Manager verlassen, haben Sie KEINE Garantie dafür, dass Ihre Installationen wiederholbar sind, und das wird Sie bei der Bereitstellung ins Gesicht beißen. Von Natürlich werden Sie gelegentlich das Monster installieren kämpfen verzetteln. Das ist auch eine gute Sache. Weil Sie die Probleme in Ihrer Entwicklungsumgebung lösen, sodass Sie sie nie in Ihrer Live-Umgebung lösen müssen. Um es zu wiederholen: Wenn Sie für Code bezahlt werden, verwenden Sie niemals die Systemumgebung. Verwenden Sie eine isolierte Umgebung, um der Gesundheit willen.
Shayne

19

Niemand scheint rbenv erwähnt zu haben .


rbenv ist ein Ruby-Manager, aber auf Paketebene (das Äquivalent zu virtualenv) bietet es nativ keinen Gemset-Manager an, um eine virtuelle Umgebung anbieten zu können.
Yekta

16

Ich denke du wirst Sandbox mögen .


9
Heiliger Mist, der schreibt um $HOME?! Wofür zum Teufel brauchen Edelsteine das ? Das Traurige ist, das ist das Beste, was ich für diesen Job gesehen habe. Sogar Bundler wird standardmäßig im Ruby-Pfad des Systems installiert.
Chris R

6
Sandbox wurde in ~ 4 Jahren nicht aktualisiert (letztes Commit war im Dezember 2008), RVM befindet sich noch in der aktiven Entwicklung (letztes Commit war gestern)
dbr

16

Ich werde die Art und Weise erwähnen, wie ich dies mit Bundler mache (die ich mit RVM verwende - RVM, um die Rubine und einen Standardsatz globaler Edelsteine ​​zu verwalten, Bundler, um projektspezifische Edelsteine ​​zu handhaben).

bundler install --binstubs --path vendor

Wenn Sie diesen Befehl im Stammverzeichnis eines Projekts ausführen, werden die in Ihrer Gemfile aufgelisteten Gems installiert, die Libs eingefügt, ./vendorund alle ausführbaren Dateien in ./binund alle requires (wenn Sie sie verwenden bundle consoleoder der Bundler benötigt) verweisen auf diese Exes und Libs.

Funktioniert bei mir.


Ein kleiner Tipp für MacOS- vendor.noindexBenutzer : Wenn Sie den Pfad benennen, den Ihre Spotlight-Suche nicht mit Daten überfüllt hat, die von den verkauften Edelsteinen indiziert wurden.
iain

1
Dies ist, was ich auch mache (mit rbenv, aber das ist eine andere Geschichte), da es das Gemset und die Ruby-Version isoliert. Nichts ist systemweit installiert und jedes Projekt hat alle Abhängigkeiten gut deklariert. Tipp: bundle config path vendorVergessen Sie dieses Argument nie.
Nandilugio

15

Wenn Sie Gems nur als Nicht-Root installieren müssen, versuchen Sie, die GEM_HOMEUmgebungsvariable festzulegen. Dann renn einfach gem.

Beispielsweise:

$ export GEM_HOME=$HOME/local/gems
$ gem install rhc

Genial! Unter OSX ist dieser Ordner versteckt:export GEM_HOME=$HOME/.local/gems
Bruno

1
Die Verwendung ist möglicherweise einfacher, GEM_HOME=$HOME/.localsodass derselbe .binOrdner verwendet wird. In diesem Fall müssen wir unsere $PATHVariable nicht aktualisieren .
Bruno


Bei weitem der sauberste Ansatz ohne Abhängigkeiten, den ich bisher gesehen habe, um Tools zu installieren, die sich bei der Aktualisierung nicht gegenseitig beschädigen (alles, was übrig bleibt, ist das Hinzufügen eines Alias ​​in Ihrem ~/.bashrcund Sie sind fertig). +1
Paradoxis

4

Ich empfehle direnv . Es ist ein Umgebungsumschalter für die Shell.

Vor jeder Eingabeaufforderung wird geprüft, ob im aktuellen und im übergeordneten Verzeichnis eine ".envrc" -Datei vorhanden ist. Wenn die Datei vorhanden (und autorisiert) ist, wird sie in eine Bash-Unter-Shell geladen, und alle exportierten Variablen werden von direnv erfasst und dann der aktuellen Shell zur Verfügung gestellt.

Hier erfahren Sie, wie Sie direnv mit ruby-install verwenden

+ Ruby-Installation

Fügen Sie dies dem hinzu ~/.direnvrc

use_ruby() {
  local ruby_root=$HOME/.rubies/$1
  load_prefix "$ruby_root"
  layout_ruby
}

Installiere ruby-install (brew install ruby-install ) und installieren Sie eine Reihe von Rubinen.

ruby-install ruby 1.9.3
ruby-install ruby 2.0.0
ruby-install ruby 2.2.0

Und dann machen Sie der Einfachheit halber ein paar Symlinks:

ln -s .rubies/1.9 ruby-1.9.3-p*
ln -s .rubies/2.0 ruby-2.0.0
ln -s .rubies/2.2 ruby-2.2.0

Und schließlich in jedem Projekt .envrc:

use ruby 2.0

Dadurch werden alle Edelsteine ​​in das Projektverzeichnis aufgenommen .direnv/ruby(erleichtert das Öffnen von Edelsteinen). Bundler fügt Wrapper-Binärdateien ein .direnv/bin(nicht mehr bundle exec!).

+ rbenv

Es ist auch möglich, rbenv durch Hinzufügen von zu verwenden use rbenv Befehl in eine beliebige .envrcDatei . Dadurch wird rbenv aktiviert, wodurch die Rubinverpackungen in den PFAD gelegt werden.

Beachten Sie, dass es nicht erforderlich ist, rbenv in .bashrc oder .zshrc zu installieren, damit dies funktioniert.

+ RVM

Hier ist die komplizierteste .envrc, die ich für Ruby-Projekte verwende:

rvm use 1.8.7
layout ruby
PATH_add .direnv/bundler-bin

Mit rvm wird die richtige Ruby-Version für Sie ausgewählt

Layoutbefehle setzen automatisch einige der üblichen Umgebungsvariablen. Derzeit existiert nur das Ruby-Layout. Dadurch wird die Umgebungsvariable GEM_HOME und das Bin-Verzeichnis auf Ihren Pfad festgelegt. Da es von der Ruby-Version abhängt, stellen Sie sicher, dass Sie es nach "rvm" aufrufen. Da jedes Ruby-Layoutverzeichnis ein eigenes GEM_HOME hat, müssen Sie die Gemsets von rvm nicht verwenden.

PATH_add stellt den angegebenen relativen Pfad voran und erweitert ihn. In diesem Fall trenne ich damit die Bundler-Binstubs von meinen eigenen Bin-Skripten mitbundle install --binstubs .direnv/bundler-bin

Wenn Sie herausfinden möchten, was diese Befehle genau tun, gehen Sie zunächst wie folgt vor: cat direnv stdlib| weniger


2
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - Aus Review
Jezrael

@ jezrael Danke für deinen Kommentar!
Shin Kim

1
Super kein Problem.
Jezrael

1

Mineshaft ist ein Projekt, an dem ich seit einiger Zeit arbeite und an dem ich weiter entwickle.

Es bietet die Möglichkeit, sowohl virtuelle Umgebungen zu erstellen, die der Funktionsweise von virtualenv ähneln, als auch Ruby global zu installieren.

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.