web-dev-qa-db-fra.com

Vous avez déjà activé X, mais votre Gemfile nécessite 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.

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

111
ming yeow

En utilisant bundle exec est la bonne façon de procéder.

En gros, ce qui se passe, c’est que vous avez mis à jour la version 0.9.2 de rake qui entre maintenant en conflit avec la version spécifiée dans votre Gemfile. Auparavant, la dernière version de rake était identique à celle de votre fichier Gemfile. Vous n'avez donc reçu aucun avertissement lorsque vous utilisez simplement rake.

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

Pour éviter de taper bundle exec ... _ tout le temps, vous pouvez configurer un alias ou une fonction dans votre shell pour les commandes que vous utilisez couramment avec Bundler. Par exemple, voici ce que j’utilise pour Rake:

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

Si vous avez une raison de conserver la version actuelle de rake (ou toute autre gemme à l'origine du problème), matt est correct, la meilleure façon de faire est de lancer bundle exec. Ceci utilise la version spécifiée dans votre Gemfile au lieu d'utiliser la dernière version de la gem que vous avez installée. (nathan.f77 a une bonne solution ci-dessous si vous ne voulez pas taper bundle exec chaque fois que vous exécutez rake)

Sinon, s'il n'y a aucune raison de ne pas mettre à jour rake, vous pouvez exécuter

bundle update rake

Ceci mettra à jour votre fichier Gemfile.lock afin qu’il utilise la dernière version de rake au lieu d’avoir à exécuter bundle exec à chaque fois.

Remarque: si vous exécutez uniquement bundle update _ Ceci mettra à jour toutes les gemmes de votre Gemfile au lieu de simplement ratisser, ce qui n'est probablement pas ce que vous voulez, car si quelque chose se brise dans votre application, vous ne saurez pas quelle mise à jour de gem l'a provoquée.


Le moyen le moins recommandé de conserver l'ancienne version sans avoir à utiliser bundle exec consiste à désinstaller les versions les plus récentes de rake.

 $ gem uninstall rake 
 
 Sélectionnez une gem à désinstaller: 
 1. rake-0.8.7 
 2. rake-0.9.2 
 3. Toutes les versions 
> 2 
 Désinstallé avec succès rake-0.9.2 

Cela fonctionne, mais si vous travaillez avec plusieurs applications qui utilisent différentes versions de rake, cela peut être pénible car vous devrez constamment installer et désinstaller différentes versions.

59
Ryan

Essayez bundle clean --force

Il supprime tous les joyaux système ne faisant pas partie de cet ensemble.

23
Oleg Dikusar

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 pas eu à utiliser bundle exec plus.

Fondamentalement, si vous utilisez bundle exec _ il utilise la version de gem installée par votre bundle, ainsi que celle contenue dans Gemfile. Sans pour autant bundle exec _ il utilise la version de votre choix, quelle que soit sa version.

13
paarshad

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; }
8
ndbroadbent

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.

7
nessur