Que veut bundle exec rake db:migrate
dire? Ou juste bundle exec rake <command>
en général?
Je comprends que cela bundle
prend soin de maintenir les choses dans le Gemfile. Je sais ce que le mot "exec" signifie. Je comprends que cela rake
maintient toutes les différentes choses que vous pouvez faire, et je sais que db:migrate
c'est l'une d'entre elles. Je ne sais tout simplement pas ce que tous ces mots font ensemble. Pourquoi devrait bundle
être utilisé pour exécuter rake
pour exécuter une migration de base de données?
la source
bundle
c'est la commande qui est utilisée par Bundler..ruby-gemset
fichier dans la racine de votre projet. Il existe également un.ruby-version
fichier qui définit votre version ruby si vous utilisez RVM.Vous exécutez
bundle exec
un programme. Les créateurs du programme l'ont écrit lorsque certaines versions de gemmes étaient disponibles. Le programme Gemfile spécifie les versions des gemmes que les créateurs ont décidé d'utiliser. Autrement dit, le script a été conçu pour fonctionner correctement avec ces versions de gemmes.Votre Gemfile à l'échelle du système peut différer de ce Gemfile. Vous pouvez avoir des gemmes plus récentes ou plus anciennes avec lesquelles ce script ne joue pas bien. Cette différence de versions peut vous donner des erreurs étranges.
bundle exec
vous aide à éviter ces erreurs. Il exécute le script en utilisant les gemmes spécifiées dans le Gemfile du script plutôt que le Gemfile à l'échelle du système. Il exécute certaines versions de gemmes avec la magie des alias de shell.Voir plus sur la page de manuel .
Voici un exemple de Gemfile:
Ici,
bundle exec
exécuterait le script à l'aide de rails version 2.8.3 et non d'une autre version que vous pourriez avoir installée à l'échelle du système.la source
rake db:migrate
abandonné,bundle exec
elle s'exécuterait en utilisant un Gemfile à l'échelle du système où l'on peut avoir un rack à 1.5.2 (dernier)?bundle exec
Utilise donc les gemmes locales "spécifiques à l'application" dans votre Gemfile de votre application, etbundle
utilise les gemmes globales "spécifiques à la machine" si vous l'avez faitgem install a_certain_gem
. local vs globalCela revient souvent lorsque votre gemfile.lock a différentes versions des gemmes installées sur votre machine. Vous pouvez recevoir un avertissement après avoir exécuté le râteau (ou rspec ou autres) tels que:
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.
Prepending
bundle exec
indique au bundler d'exécuter cette commande indépendamment de la différence de version. Il n'y a pas toujours de problème, cependant, vous pourriez rencontrer des problèmes.Heureusement, il existe un joyau qui résout ce problème: rubygems-bundler.
$ gem install rubygems-bundler
$ $ gem regenerate_binstubs
Essayez ensuite votre râteau, rspec ou autre chose.
la source
Il convient probablement de mentionner qu'il existe des moyens d'omettre
bundle exec
(ils sont tous indiqués dans le chapitre 3.6.1 du livre Tutoriel Michael Hartls Ruby on Rails ).Le plus simple est d'utiliser simplement une version suffisamment à jour de RVM (> = 1.11.x).
Si vous êtes limité à une version antérieure de RVM, vous pouvez toujours utiliser cette méthode également mentionnée par calasyr :
Le
bundler_stubs
répertoire doit ensuite également être ajouté au.gitignore
fichier.Une troisième option consiste à utiliser la
rubygems-bundler
gemme si vous n'utilisez pas RVM:la source
Lorsque vous exécutez directement la tâche de râteau ou exécutez n'importe quel fichier binaire d'une gemme, rien ne garantit que la commande se comportera comme prévu. Parce qu'il peut arriver que vous ayez déjà la même gemme installée sur votre système qui a une version disons 1.0 mais dans votre projet vous avez une version supérieure disons 2.0. Dans ce cas, vous ne pouvez pas prédire lequel sera utilisé.
Pour appliquer la version de gemme souhaitée, vous utilisez l'aide de la
bundle exec
commande qui exécuterait le binaire dans le contexte du bundle actuel. Cela signifie que lorsque vous utilisez le bundle exec, bundler vérifie la version gem configurée pour le projet en cours et l'utilise pour effectuer la tâche.J'ai également écrit un article à ce sujet qui montre également comment nous pouvons éviter de l'utiliser en utilisant des talons de bac.
la source
Je n'ai pas
bundle exec
beaucoup utilisé , mais je le mets en place maintenant.J'ai eu des cas où le mauvais râteau a été utilisé et beaucoup de temps perdu à rechercher le problème. Cela vous aide à éviter cela.
Voici comment configurer RVM pour pouvoir l'utiliser
bundle exec
par défaut dans un répertoire de projet spécifique:https://thoughtbot.com/blog/use-bundlers-binstubs
la source
Cela signifie utiliser le râteau que le bundler connaît et fait partie de votre Gemfile sur tout rake que le bundler n'a pas connu et exécuter la tâche db: migrate.
la source