396 Stimmen

Was bedeutet bundle exec rake?

Was bedeutet bundle exec rake db:migrate bedeuten? Oder nur bundle exec rake <command> im Allgemeinen?

Ich verstehe, dass bundle kümmert sich um die Pflege der Gemfile. Ich weiß, was das Wort "exec" bedeutet. Ich verstehe, dass rake unterhält all die verschiedenen Skripte, die man machen kann, und ich weiß, dass db:migrate ist eine davon. Ich weiß einfach nicht, was all diese Wörter zusammen machen. Warum sollte bundle zur Ausführung verwendet werden rake um eine Datenbankmigration durchzuführen?

508voto

ghoppe Punkte 20610

bundle exec ist eine Bündler um ein Skript im Kontext des aktuellen Bundles auszuführen (dasjenige aus Ihrem Verzeichnis Gemfile ). rake db:migrate ist das Skript, in dem db ist der Namespace und migrieren ist der Name der definierten Aufgabe.

Also bundle exec rake db:migrate führt das Rake-Skript mit dem Befehl db:migrate im Kontext des aktuellen Bündels.

Zum "Warum?" Ich zitiere aus dem Bundler-Seite :

In einigen Fällen kann das Ausführen von Programmen ohne bundle exec kann funktionieren, wenn die ausführbare Datei zufällig in Ihrem System installiert ist und keine Edelsteine enthält, die mit Ihrem Bundle in Konflikt stehen.

Dies ist jedoch unzuverlässig und führt zu erheblichen Schmerzen. Auch wenn es so aussieht, als ob es funktioniert, kann es sein, dass es in Zukunft oder auf einem anderen Rechner nicht mehr funktioniert.

188voto

Rose Perrone Punkte 58235

Du läufst bundle exec auf ein Programm. Die Schöpfer des Programms haben es geschrieben, als bestimmte Versionen von Gems verfügbar waren. Das Gemfile des Programms gibt die Versionen der Edelsteine an, die die Ersteller verwenden wollten. Das heißt, das Skript wurde so erstellt, dass es mit diesen Edelsteinversionen korrekt läuft.

Ihr systemweites Gemfile kann von diesem Gemfile abweichen. Es kann sein, dass Sie neuere oder ältere Gems haben, mit denen dieses Skript nicht gut zusammenarbeitet. Dieser Unterschied in den Versionen kann zu seltsamen Fehlern führen.

bundle exec hilft Ihnen, diese Fehler zu vermeiden. Es führt das Skript mit den Gems aus, die in der Gemfile des Skripts angegeben sind, und nicht mit der systemweiten Gemfile. Es führt die bestimmten Gem-Versionen mit der Magie der Shell-Aliase aus.

Siehe mehr auf die Manpage .

Hier ist ein Beispiel für ein Gemfile:

source 'http://rubygems.org'

gem 'rails', '2.8.3'

Hier, bundle exec würde das Skript mit der Rails-Version 2.8.3 ausführen und nicht mit einer anderen Version, die Sie möglicherweise systemweit installiert haben.

11voto

Benjamin Dunphy Punkte 839

Dieses Problem tritt häufig auf, wenn Ihre gemfile.lock verschiedene Versionen der auf Ihrem Rechner installierten Gems enthält. Sie können eine Warnung erhalten, nachdem Sie rake (oder rspec oder andere) wie folgt ausgeführt haben:

You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.

Vorangestellte bundle exec weist den Bundler an, diesen Befehl unabhängig vom Versionsunterschied auszuführen. Dies ist nicht immer ein Problem, es kann jedoch zu Problemen kommen.

Glücklicherweise gibt es einen Edelstein, der dieses Problem löst: rubygems-bundler.

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

Versuchen Sie dann Ihren Rake, rspec oder was auch immer erneut.

7voto

tschale Punkte 950

Es sollte vielleicht erwähnt werden, dass es Möglichkeiten gibt, Folgendes wegzulassen bundle exec (sie sind alle in Kapitel 3.6.1 von Michael Hartls Ruby on Rails Tutorial Buch).

Am einfachsten ist es, eine ausreichend aktuelle Version von RVM (>= 1.11.x) zu verwenden.

Wenn Sie auf eine frühere Version von RVM beschränkt sind, können Sie immer diese Methode verwenden, die auch von Kalasyr :

$ rvm get head && rvm reload
$ chmod +x $rvm_path/hooks/after_cd_bundler
$ bundle install --binstubs=./bundler_stubs

En bundler_stubs Verzeichnis sollte dann auch in das .gitignore Datei.

Eine dritte Möglichkeit ist die Verwendung der rubygems-bundler gem, wenn Sie RVM nicht verwenden:

$ gem install rubygems-bundler
$ gem regenerate_binstubs

1voto

calasyr Punkte 346

Ich habe nicht verwendet bundle exec viel, aber ich richte es jetzt ein.

Ich habe Fälle erlebt, in denen die falsche Harke verwendet wurde und viel Zeit damit verschwendet wurde, das Problem zu finden. Dies hilft Ihnen, das zu vermeiden.

Hier erfahren Sie, wie Sie RVM so einrichten, dass Sie bundle exec standardmäßig innerhalb eines bestimmten Projektverzeichnisses:

https://thoughtbot.com/blog/use-bundlers-binstubs

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X