Vous avez déjà activé X, mais votre Gemfile nécessite Y

128

Lors de l'exécution, rakej'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 rakeau lieu de rakesemble fonctionner, mais est-ce le meilleur moyen de résoudre ce problème?

ming yeow
la source
C'est aussi ce qui fait de RVM un outil formidable. Cela vous permettrait d'avoir un ensemble distinct de gemmes pour chacun de ces projets afin que vous n'ayez pas à vous soucier que cela se reproduise.
rm-rf

Réponses:

84

L'utilisation bundle exec est la bonne façon de faire cela.

Fondamentalement, ce qui se passe, c'est que vous avez mis à jour rake à 0.9.2 qui entre maintenant en conflit avec la version spécifiée dans votre Gemfile. Auparavant, la dernière version de rakevous correspondait à la version de votre Gemfile, vous n'avez donc reçu aucun avertissement lors de la simple utilisation rake.

Yehuda Katz (l'un des développeurs originaux de Bundler) explique tout dans ce billet 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 "$@"
}
mat
la source
5
Le billet de blog n'explique pas vraiment grand-chose. La vraie question est: pourquoi le rubis vierge n'a-t-il pas les bonnes dépendances et pourquoi alors se plaindre d'avoir les mauvaises?
Otheus
64

Si vous avez une raison de conserver la version actuelle de rake (ou tout autre gemme à l'origine du problème), matt a raison, la meilleure façon de le faire est d'exécuter bundle exec. Cela utilise la version spécifiée dans votre Gemfile au lieu d'utiliser la dernière version de la gemme que vous avez installée. (nathan.f77 a une bonne solution ci - dessous si vous ne voulez pas taper à bundle execchaque 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

Cela mettra à jour votre Gemfile.lock pour utiliser la dernière version de rake au lieu de devoir l'exécuter à bundle execchaque fois.

Remarque: si vous exécutez uniquement, bundle updatecela mettra à jour toutes les gemmes de votre Gemfile au lieu de simplement rake, 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 gemme l'a causé.


La façon la moins recommandée de conserver l'ancienne version sans avoir à l'utiliser bundle execest de désinstaller les nouvelles versions de rake.

$ gem uninstall rake

Sélectionnez le gem à désinstaller:
 1. râteau-0.8.7
 2. rake-0.9.2
 3. Toutes les versions
> 2
Rake-0.9.2 a bien été désinstallé

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.

Ryan
la source
Cela a fonctionné pour moi. Pour une raison quelconque, il n'y avait qu'une seule version (0.8.7) installée. Alors d'abord je l'ai fait gem install rake. Puis gem uninstall rakeet choisissez 0.9.2.
B Seven
7
bundle updatemettra également à jour tous les gemmes sans versions spécifiées vers la dernière version disponible. Ce n'est peut-être pas ce que vous voulez. bundle update rakeserait plus precies.
Alex Neth
J'ai le même problème avec public_suffixau lieu de rake. La course à pied bundle update public_suffixn'a malheureusement aucun effet.
Dmitri Zaitsev
53

Essayer bundle clean --force

Il supprime tous les joyaux système qui ne figurent pas dans cet ensemble

Oleg Dikusar
la source
13

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

Fondamentalement, si vous l'utilisez, bundle execil utilise n'importe quelle version de gem est installée par votre bundle, alors que contient le Gemfile. Sans bundle execil utilise la version par défaut de votre système.

paarshad
la source
8

Ooh! L'article Katz est excellent!

J'aime le mieux cette solution:

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.

nessur
la source
8

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; }
ndbroadbent
la source
Pour clarifier, le fichier .bashrc est probablement situé dans votre répertoire personnel [~ / .bashrc]. Ce fichier est chargé à chaque fois que vous ouvrez une nouvelle fenêtre de terminal.
Ryan
0

Une autre façon de ne pas le taper à chaque fois est avec un Makefile, par exemple

rake :
    bundle exec rake
qwr
la source