J'ai appris Rails en utilisant seulement la commande rake comme rake db:migrate
; Cependant, je viens de lire que l'utilisation devrait utiliser les bundle exec rake ...
au lieu de simplement rake
et maintenant je ne sais plus trop lequel utiliser. Donc, devriez-vous utiliser bundle exec rake
au lieu de simplement rake
ou est-ce juste une chose de préférence? Toute opinion serait très appréciée! Merci!
Réponses
Trop de publicités?bundle exec
exécute une commande dans le cadre de votre bundle.
Cela signifie qu'il utilise les pierres spécifié dans votre Gemfile. La plupart du temps, l'exécution d' bundle exec rake foo
a les mêmes résultats que si vous venez a couru rake foo
, surtout si vous avez les mêmes gemmes installé à l'échelle du système que dans votre Gemfile. Toutefois, certaines applications peuvent spécifier les différentes versions de gemmes que ceux que vous avez installé tout le système, et ceux exacte des gemmes et des versions pour être en mesure de fonctionner correctement. Si vous venez d'exécuter sans bundle exec
, vous pouvez obtenir des erreurs étranges.
À l'aide de bundle exec
garantit que le programme est exécuté avec l'environnement spécifié dans le gemfile, qui nous l'espérons signifie que c'est l'environnement que les créateurs du programme voulez être exécuté, qui nous l'espérons signifie qu'il doit exécuter correctement n'importe quelle configuration bizarre que vous avez sur votre ordinateur.
Essentiellement, il normalise l'environnement dans lequel le programme est exécuté. Cela permet d'éviter la version de l'enfer et rend la vie beaucoup plus facile.
Voir http://bundler.io/v1.3/man/bundle-exec.1.html pour plus d'info.
$ bundle exec rake db:migrate
Utilise la version de râteau spécifié dans le Gemfile pour exécuter la tâche rake db:migrate
.
Mais il n'y a pas de rake gem spécifié dans le Gemfile!
Oui, mais un râteau gem a été installé en tant que dépendance de certains autres gem-chercher dans le Gemfile.verrouillage. Donc, la règle doit être: Utilise la version de râteau spécifié dans le Gemfile.verrouillage.
Mais Gemfile.verrouillage de ne pas spécifier une version spécifique--il spécifie une version supérieure à x.y!
Ensuite, la règle doit être: Utilise la version de râteau qui a été installé dans le courant sertie.
$ rake db:migrate
Normalement, lorsque vous émettez une commande sur la ligne de commande, par exemple râteau, votre système de recherches pour la commande dans la liste des répertoires spécifiés dans la variable d'environnement PATH. Le premier répertoire qui contient la commande est la version de la commande qui est utilisé. Pour voir quel répertoire, vous pouvez le faire:
$ which rake
Donc, si vous exécutez,
$ rake db:migrate
qui peut utiliser un autre râteau joyau de celui que vous avez installé avec l' bundle install
. Mais, même si votre système trouve le râteau même version que la version bundle exec
, toutes les gemmes par la commission du code source sera recherchée dans des endroits à l'extérieur de votre projet est sertie. Par conséquent, il existe de nombreuses façons qui vient:
$ rake db:migrate
pouvez visser les choses.
Selon le Ruby on Rails Tutoriel Livre(gratuit en ligne), la section 3.6, si vous utilisez rvm 1.11.x+ vous n'avez pas besoin de faire précéder les commandes avec bundle exec
.
Si vous exécutez une tâche sans bundle exec
, Rubygems récupérera la dernière version de la gem installée sur votre système.
En ajoutant le préfixe bundle exec
l'exécutable s'exécutera dans le contexte de votre fichier Gemfile.lock, ce qui signifie qu'il sera exécuté avec la version définie dans le fichier gem.