Bundle Exec Rake verwenden oder nur Rake?

81

Ich habe Rails nur mit dem Rake-Befehl gelernt rake db:migrate. Ich habe jedoch gelesen, dass ich das bundle exec rake ...anstelle von einfach verwenden sollte rake. Jetzt bin ich verwirrt, was ich verwenden soll.

Sollte ich bundle exec rakestatt nur verwenden, rakeoder ist es nur eine Präferenzsache? Jeder Einblick wäre sehr dankbar! Vielen Dank!

agentbanks217
quelle

Antworten:

126

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 foofü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 execGarantien, 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 .

Jergason
quelle
4
Wenn Sie es satt haben, ständig Bundle Exec einzugeben, können Sie rvm so konfigurieren, dass es nicht erforderlich ist: ruby.railstutorial.org/chapters/…
Lance Fisher
1
Hinweis: Die Bundle-Manpage wurde geändert. Die korrekte Version zu
Americo Savinon
1
Ein netter Nebeneffekt der Verwendung bundle execist, dass Sie auch darüber informiert werden, ob Sie bundle installVersionen von fehlenden Edelsteinen installieren sollten, die im Vergleich zur Datei Gemfile.lock fehlen.
Jay Mitchell
Sie haben es sehr gut erklärt. Danke.
Arup Rakshit
5

$ 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 findet bundle 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.

7stud
quelle
1

Wenn bundle execRubygems exacutable ausführt, ruft Rubygems die neueste Version des auf Ihrem System installierten Edelsteins ab.

Wenn Sie bundle execstattdessen 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.

Pastullo
quelle