185 votes

Vous avez déjà activé X, mais exige de votre Gemfile Y

Lors de l'exécution de rake j'obtiens cette erreur:

Vous avez déjà activé rake 0.9.2, mais votre Gemfile nécessite rake 0.8.7. Pensez à utiliser bundle exec.

Utiliser bundle exec rake au lieu de rake semble fonctionner, mais est-ce la meilleure façon de résoudre ce problème?

116voto

matt Points 33799

À l'aide de bundle exec est la bonne façon de le faire.

Fondamentalement, ce qui se passe, c'est que vous avez mis à jour le rake à 0.9.2 qui maintenant en conflit avec la version spécifiée dans votre Gemfile. Déjà la dernière version de rake vous avait été à la hauteur de la version dans votre Gemfile, de sorte que vous n'avez reçu aucun avertissement lorsque simplement à l'aide d' rake.

Yehuda Katz (l'un des premiers Bundler développeurs) explique tout dans cet article de blog.

Pour éviter de taper bundle exec ... tout le temps, vous pouvez définir un alias ou une fonction dans votre shell pour les commandes que vous utilisez habituellement avec Bundler. Par exemple, c'est ce que j'utilise pour le Râteau:

$ type bake
bake is a function
bake () 
{ 
    bundle exec rake "$@"
}

73voto

Ryan Points 4221

Si vous avez une raison de garder la version actuelle de râteau (ou tout autre bijou est à l'origine du problème), matt est correct, la meilleure façon de le faire est d'exécuter bundle exec. Il utilise la version spécifiée dans votre Gemfile au lieu d'utiliser la version la plus récente de la gemme que vous avez installés. (nathan.f77 a une bonne solution ci-dessous si vous ne voulez pas taper bundle exec chaque fois que vous exécutez rake)

Sinon, si il n'y a aucune raison de ne pas mettre à jour le râteau, vous pouvez exécuter

bundle update rake

Ce sera effectivement mise à jour de votre Gemfile.serrure à utiliser la dernière version de râteau plutôt que d'avoir à courir en bundle exec tous les temps.

Remarque: si vous exécutez simplement bundle update ceci mettra à jour toutes les gemmes dans votre Gemfile au lieu de simplement râteau, qui n'est probablement pas ce que vous voulez, parce que si quelque chose se brise dans votre application, vous ne saurez pas à quel bijou de mise à jour a causé.


Le moins recommandé de garder l'ancienne version sans avoir à utiliser bundle exec est de désinstaller les versions les plus récentes de la commission.

$ gem désinstaller râteau

Sélectionnez gem pour désinstaller:
 1. râteau-0.8.7
 2. râteau-0.9.2
 3. Toutes les versions
> 2
Correctement désinstallé râteau-0.9.2

Cela fonctionne, mais si vous travaillez avec plusieurs applications qui utilisent des versions différentes de râteau, cela peut être une douleur parce que vous serez constamment avoir à l'installer et de désinstaller des versions différentes.

15voto

paarshad Points 225

La dernière fois que cela m'est arrivé, j'avais mis à jour toutes mes pierres précieuses. J'ai fait un gem uninstall rake et il a énuméré les options de version. J'ai choisi le plus récent, puis je n'ai plus eu à utiliser bundle exec .

Fondamentalement, si vous utilisez bundle exec il utilise la version de gem installée par votre bundle, ainsi que celle contenue dans le fichier Gemfile. Sans bundle exec il utilise une version quelconque de votre système.

10voto

nessur Points 783

Ooh! L'article de Katz est excellent!

J'aime cette solution le meilleur:

 bundle install --binstubs
 

afin que vous puissiez maintenant taper

 bin/rake .stuff.
 

Pour quelqu'un comme moi qui développe des applications 2.3 et 3.0.9, cela me fait me sentir beaucoup mieux.

9voto

nathan.f77 Points 4941

bundle exec est correct, mais vous ne voulez pas le taper à chaque fois.

Vous pouvez mettre ceci dans votre .bashrc:

 # Automatically invoke bundler for rake, if necessary.
rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X