bundle exec
führt einen Befehl im Kontext Ihres Bundles aus.
Das heißt, es werden die in Ihrer Gemfile angegebenen Edelsteine verwendet. In den meisten Fällen bundle exec rake foo
führt das Ausführen zu denselben Ergebnissen wie beim Ausführen rake foo
, insbesondere wenn systemweit dieselben Gems wie in Ihrer Gemfile installiert sind. Einige Anwendungen geben jedoch möglicherweise andere Versionen von Gems an als die, die Sie systemweit installiert haben, und möchten möglicherweise, dass genau diese Gems und Versionen ordnungsgemäß ausgeführt werden. Wenn Sie nur ohne laufen bundle exec
, können einige seltsame Fehler auftreten.
Die Verwendung von bundle exec
Garantien, dass das Programm mit der in der Gem-Datei angegebenen Umgebung ausgeführt wird, bedeutet hoffentlich, dass es die Umgebung ist, in der die Ersteller des Programms es ausführen möchten, was hoffentlich bedeutet, dass es korrekt ausgeführt werden sollte, unabhängig davon, in welchem seltsamen Setup Sie sich befinden dein Computer.
Grundsätzlich wird die Umgebung standardisiert, in der das Programm ausgeführt wird. Dies hilft, die Version der Hölle zu vermeiden und macht das Leben viel einfacher.
Weitere Informationen finden Sie unter http://bundler.io/v1.3/man/bundle-exec.1.html .
bundle exec
ist, dass Sie auch darüber informiert werden, ob Siebundle install
Versionen von fehlenden Edelsteinen installieren sollten, die im Vergleich zur Datei Gemfile.lock fehlen.$ bundle exec rake db:
migrate Verwendet die in der Gemfile angegebene Version des Rakes, um die Rake-Task auszuführen
db:migrate
.In der Gemfile ist jedoch kein Rake-Edelstein angegeben!
Ja, aber ein Rake-Edelstein wurde als Abhängigkeit von einem anderen Edelstein installiert - siehe Gemfile.lock. Die Regel muss also lauten: Verwendet die in Gemfile.lock angegebene Version des Rakes.
Gemfile.lock gibt jedoch keine bestimmte Version an - es gibt eine Version größer als xy an!
Dann muss die Regel lauten: Verwendet die Version des Rakes, die im aktuellen Gemset installiert wurde.
$ rake db: migrate
Normalerweise sucht Ihr System, wenn Sie einen Befehl in der Befehlszeile eingeben, z. B. rake, nach dem Befehl in der Liste der Verzeichnisse, die in Ihrer Umgebungsvariablen PATH angegeben sind. Das erste Verzeichnis, das den Befehl enthält, ist die Version des verwendeten Befehls. Um zu sehen, welches Verzeichnis das ist, können Sie Folgendes tun:
$ which rake
Wenn Sie also ausführen,
$ rake db:migrate
das kann einen anderen Rechenstein verwenden als den, mit dem Sie installiert haben
bundle install
. Aber selbst wenn Ihr System dieselbe Rake-Version wie findetbundle exec
, werden alle Edelsteine, die für den Rake-Quellcode erforderlich sind, an Stellen außerhalb des Gemset Ihres Projekts gesucht. Daher gibt es viele Möglichkeiten, die nur:$ rake db:migrate
kann Dinge vermasseln.
Laut Ruby on Rails Tutorial Book (kostenlos online), Abschnitt 3.6, müssen Sie Befehle nicht mit vorangestellt haben, wenn Sie rvm 1.11.x + verwenden
bundle exec
.quelle
Wenn
bundle exec
Rubygems exacutable ausführt, ruft Rubygems die neueste Version des auf Ihrem System installierten Edelsteins ab.Wenn Sie
bundle exec
stattdessen das Präfix hinzufügen, wird die ausführbare Datei im Kontext Ihrer Gemfile.lock ausgeführt. Dies bedeutet, dass sie mit der in der Gem-Datei definierten Version ausgeführt wird.quelle