J'ai appris Rails en utilisant juste la commande rake comme rake db:migrate
; cependant, j'ai lu que je devrais utiliser le bundle exec rake ...
au lieu de simplement rake
. Maintenant, je ne sais pas quoi utiliser.
Dois-je utiliser bundle exec rake
au lieu de simplement rake
ou est-ce simplement une préférence? Toute opinion serait très appréciée! Merci!
bundle exec
exécute une commande dans le contexte de votre bundle.
Cela signifie qu'il utilise les gemmes spécifiées dans votre Gemfile. La plupart du temps, exécutant bundle exec rake foo
a les mêmes résultats que si vous veniez d'exécuter rake foo
, surtout si vous avez les mêmes gemmes installées dans tout le système que dans votre Gemfile. Cependant, certaines applications peuvent spécifier des versions de gemmes différentes de celles que vous avez installées à l'échelle du système et peuvent souhaiter que ces gemmes et versions exactes puissent fonctionner correctement. Si vous venez de courir sans bundle exec
, vous pouvez obtenir des erreurs étranges.
En utilisant bundle exec
garantit que le programme est exécuté avec l'environnement spécifié dans le fichier gemfile, ce qui signifie, espérons-le, que c'est l'environnement dans lequel les créateurs du programme souhaitent qu'il soit exécuté, ce qui signifie qu'il devrait fonctionner correctement, quelle que soit la configuration bizarre que vous avez sur ton ordinateur.
Il standardise essentiellement l'environnement dans lequel le programme est exécuté. Cela permet d'éviter l'enfer des versions et rend la vie beaucoup plus facile.
Voir http://bundler.io/v1.3/man/bundle-exec.1.html pour plus d'informations.
$ bundle exec rake db: migrate
Utilise la version de râteau spécifiée dans le Gemfile pour exécuter la tâche de râteau db:migrate
.
Mais il n'y a pas de gemme de râteau spécifiée dans le Gemfile!
Oui, mais une gemme de râteau a été installée comme dépendance d'une autre gemme - regardez dans Gemfile.lock. La règle doit donc être: Utilise la version de rake spécifiée dans Gemfile.lock.
Mais Gemfile.lock ne spécifie pas de version spécifique - il spécifie une version supérieure à x.y!
Alors la règle doit être: Utilise la version de râteau qui a été installée dans le jeu de gemmes actuel.
$ rake db: migrer
Normalement, lorsque vous émettez une commande sur la ligne de commande, par ex. rake, votre système recherche la commande dans la liste des répertoires spécifiés dans votre variable d'environnement PATH. Le premier répertoire contenant la commande est la version de la commande utilisée. Pour voir de quel répertoire il s'agit, vous pouvez faire:
$ which rake
Donc, si vous exécutez,
$ rake db:migrate
que peut utiliser une gemme de râteau différente de celle que vous avez installée avec bundle install
. Mais, même si votre système trouve la même version de râteau que bundle exec
, toutes les gemmes requises par le code source de rake seront recherchées à l'extérieur du jeu de gemmes de votre projet. Par conséquent, il existe de nombreuses façons qui:
$ rake db:migrate
peut foutre les choses.
Selon le Ruby on Rails Tutorial Book (gratuit en ligne), section 3.6, si vous utilisez rvm 1.11.x + alors vous n'avez pas besoin de faire précéder les commandes avec bundle exec
.
exécuter tout exacutable sans bundle exec
Rubygems récupérera la dernière version de la gemme installée sur votre système.
En ajoutant le bundle exec
le préfixe aura à la place l'exécutable en cours d'exécution dans le contexte de votre Gemfile.lock, ce qui signifie qu'il sera exécuté en utilisant la version définie dans le fichier gem.