Was heißt bundle exec rake db:migrate
das Oder nur bundle exec rake <command>
allgemein?
Ich verstehe, dass es bundle
darum geht, die Dinge in der Gemfile zu pflegen. Ich weiß, was das Wort "exec" bedeutet. Ich verstehe, dass rake
all die verschiedenen Scripty-Dinge, die Sie tun können , beibehalten werden, und ich weiß, dass dies db:migrate
eine davon ist. Ich weiß nur nicht, was all diese Wörter zusammen tun. Warum soll bundle
verwendet werden , um auszuführen , rake
eine Datenbank migrieren ausführen?
quelle
bundle
ist der Befehl, der von Bundler verwendet wird..ruby-gemset
Datei in Ihrem Projektstamm haben. Es gibt auch eine.ruby-version
Datei, die Ihre Ruby-Version festlegt, wenn Sie RVM verwenden.Sie laufen
bundle exec
auf einem Programm. Die Entwickler des Programms haben es geschrieben, als bestimmte Versionen von Edelsteinen verfügbar waren. Das Programm Gemfile gibt die Versionen der Edelsteine an, für die sich die Ersteller entschieden haben. Das heißt, das Skript wurde so erstellt, dass es mit diesen Edelsteinversionen korrekt ausgeführt wird.Ihre systemweite Gemfile kann von dieser Gemfile abweichen. Möglicherweise haben Sie neuere oder ältere Edelsteine, mit denen dieses Skript nicht gut funktioniert. Dieser Unterschied in den Versionen kann zu seltsamen Fehlern führen.
bundle exec
hilft Ihnen, diese Fehler zu vermeiden. Das Skript wird mit den in der Gemfile des Skripts angegebenen Gems und nicht mit der systemweiten Gemfile ausgeführt. Es führt bestimmte Edelsteinversionen mit der Magie von Shell-Aliasen aus.Weitere Informationen finden Sie auf der Manpage .
Hier ist ein Beispiel für Gemfile:
Hier
bundle exec
würde das Skript mit Rails Version 2.8.3 ausgeführt und nicht mit einer anderen Version, die Sie möglicherweise systemweit installiert haben.quelle
rake db:migrate
ausgelassenbundle exec
hat, wird sie mit einer systemweiten Gem-Datei ausgeführt, in der möglicherweise ein Rack mit 1.5.2 (spätestens) vorhanden ist.bundle exec
verwendet die „App-spezifischen“, lokale Edelsteine in Ihrer Gemfile Ihrer Anwendung undbundle
verwendet die „maschinenspezifische“, globale Edelsteine , wenn Sie getan habengem install a_certain_gem
. lokal gegen globalDies tritt häufig auf, wenn in Ihrem gemfile.lock verschiedene Versionen der Gems auf Ihrem Computer installiert sind. Möglicherweise erhalten Sie eine Warnung, nachdem Sie rake (oder rspec oder andere) ausgeführt haben, z.
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.
Das Voranstellen
bundle exec
weist den Bundler an, diesen Befehl unabhängig vom Versionsunterschied auszuführen. Es gibt nicht immer ein Problem, es können jedoch Probleme auftreten.Glücklicherweise gibt es ein Juwel, das dieses Problem löst: Rubygems-Bundler.
$ gem install rubygems-bundler
$ $ gem regenerate_binstubs
Dann versuchen Sie es erneut mit Ihrem Rechen, Rspec oder was auch immer.
quelle
Es sollte wahrscheinlich erwähnt werden, dass es Möglichkeiten gibt, diese wegzulassen
bundle exec
(sie sind alle in Kapitel 3.6.1 des Michael Hartls Ruby on Rails-Tutorial- Buches aufgeführt).Am einfachsten ist es, nur 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 calasyr erwähnt wird :
Das
bundler_stubs
Verzeichnis sollte dann auch zur.gitignore
Datei hinzugefügt werden.Eine dritte Option ist die Verwendung des
rubygems-bundler
Edelsteins, wenn Sie kein RVM verwenden:quelle
Wenn Sie die Rake-Task direkt ausführen oder eine Binärdatei eines Gems ausführen, gibt es keine Garantie dafür, dass sich der Befehl wie erwartet verhält. Weil es passieren kann, dass Sie bereits dasselbe Juwel auf Ihrem System installiert haben, das eine Version von beispielsweise 1.0 hat, aber in Ihrem Projekt eine höhere Version von beispielsweise 2.0 haben. In diesem Fall können Sie nicht vorhersagen, welches verwendet wird.
Um die gewünschte Gem-Version zu erzwingen, verwenden Sie den
bundle exec
Befehl, der die Binärdatei im Kontext des aktuellen Bundles ausführt. Das heißt, wenn Sie Bundle Exec verwenden, überprüft Bundler die für das aktuelle Projekt konfigurierte Gem-Version und verwendet diese, um die Aufgabe auszuführen.Ich habe auch einen Beitrag darüber geschrieben, der auch zeigt, wie wir es vermeiden können, ihn mit bin stubs zu verwenden.
quelle
Ich habe nicht
bundle exec
viel benutzt, aber ich richte es jetzt ein.Ich hatte Fälle, in denen der falsche Rechen verwendet wurde und viel Zeit damit verschwendet wurde, das Problem aufzuspüren. Dies hilft Ihnen, dies zu vermeiden.
So richten Sie RVM so ein, dass Sie es
bundle exec
standardmäßig in einem bestimmten Projektverzeichnis verwenden können:https://thoughtbot.com/blog/use-bundlers-binstubs
quelle
Dies bedeutet, dass Sie den Rake verwenden, den der Bundler kennt und der Teil Ihrer Gemfile ist, und zwar über jeden Rake, den der Bundler nicht kennt, und die Aufgabe db: migrate ausführen.
quelle