Hai già attivato X, ma il tuo Gemfile richiede Y


128

Durante l'esecuzione rakeottengo questo errore:

Hai già attivato il rake 0.9.2, ma il tuo Gemfile richiede rake 0.8.7. Prendi in considerazione l'utilizzo del bund exec.

Usare bundle exec rakeinvece di rakesembra funzionare, ma è il modo migliore per risolvere questo problema?


Questo è anche ciò che rende RVM un ottimo strumento. Ti permetterebbe di avere un set separato di gemme per ciascuno di questi progetti, così non dovresti preoccuparti che questo accada di nuovo.
rm-rf,

Risposte:


84

L'utilizzo bundle exec è il modo giusto per farlo.

Fondamentalmente ciò che sta accadendo è che hai aggiornato il rake a 0.9.2 che ora è in conflitto con la versione specificata nel tuo Gemfile. In precedenza l'ultima versione di rakete aveva abbinato la versione nel tuo Gemfile, quindi non hai ricevuto alcun avviso quando lo hai semplicemente usato rake.

Yehuda Katz (uno degli sviluppatori Bundler originali) spiega tutto in questo post del blog .

Per evitare di digitare bundle exec ...continuamente, è possibile impostare un alias o una funzione nella shell per i comandi che si usano comunemente con Bundler. Ad esempio questo è quello che uso per Rake:

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

5
Il post sul blog non spiega molto. La vera domanda è: perché il rubino vergine non ottiene le dipendenze giuste e perché poi si lamenta di avere quelle sbagliate?
Otheus,

64

Se hai un motivo per mantenere l'attuale versione di rake (o qualunque altra gemma stia causando il problema), matt è corretto, il modo migliore per farlo è quello di eseguire bundle exec. Questo utilizza la versione specificata nel tuo Gemfile invece di usare la versione più recente della gemma che hai installato. (nathan.f77 ha una buona soluzione di seguito se non si desidera digitare bundle execogni volta che si esegue il rake)

Altrimenti, se non vi è alcun motivo per non aggiornare il rake, è possibile eseguire

bundle update rake

Questo effettivamente aggiornerà Gemfile.lock per utilizzare la versione più recente di rake invece di dover eseguire bundle execogni volta.

Nota: se esegui solo bundle updatequesto, aggiornerai tutte le gemme nel tuo Gemfile anziché solo rastrellare, che probabilmente non è quello che vuoi, perché se qualcosa si rompe nella tua applicazione non saprai quale aggiornamento gemma lo ha causato.


Il modo meno raccomandato per mantenere la versione precedente senza dover utilizzare bundle execè disinstallare le versioni più recenti di rake.

$ gem disinstalla rake

Seleziona gemma da disinstallare:
 1. rake-0.8.7
 2. rake-0.9.2
 3. Tutte le versioni
> 2
Rake-0.9.2 disinstallato correttamente

Funziona, ma se stai lavorando con più app che utilizzano diverse versioni di rake, questo può essere un problema perché ti troverai costantemente a dover installare e disinstallare versioni diverse.


Questo ha funzionato per me. Per qualche motivo, era installata una sola versione (0.8.7). Quindi prima l'ho fatto gem install rake. Quindi gem uninstall rakee ho scelto 0.9.2.
B Seven

7
bundle updateaggiornerà anche eventuali gemme senza le versioni specificate all'ultima versione disponibile. Potrebbe non essere quello che vuoi. bundle update rakesarebbero più prede.
Alex Neth,

Ho lo stesso problema con public_suffixinvece di rake. La corsa bundle update public_suffix, purtroppo, non ha alcun effetto.
Dmitri Zaitsev,

53

Provare bundle clean --force

Rimuove ogni gemma di sistema non presente in questo bundle


13

L'ultima volta che mi è successo, ho aggiornato tutte le mie gemme. Ho fatto un gem uninstall rakeed elencato le opzioni di versione. Ho scelto quello più recente, quindi non ho più dovuto usarlo bundle exec.

Fondamentalmente, se bundle execlo usi usa qualunque versione gemma sia installata dal tuo bundle, quindi cosa c'è nel Gemfile. Senza di bundle execessa utilizza qualsiasi versione predefinita del sistema.


8

Ooh! L'articolo di Katz è eccellente!

Mi piace questa soluzione al meglio:

bundle install --binstubs

così ora puoi digitare

bin/rake .stuff.

Per qualcuno come me che sta sviluppando entrambe le app 2.3 e 3.0.9, questo mi fa sentire molto meglio.


8

bundle exec è corretto, ma non vuoi scriverlo ogni volta.

Puoi metterlo nel tuo .bashrc:

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

Per chiarire, il file .bashrc si trova probabilmente nella directory home [~ / .bashrc]. Questo file viene caricato ogni volta che si apre una nuova finestra del terminale.
Ryan

0

Un altro modo per non digitarlo ogni volta è con un Makefile, per esempio

rake :
    bundle exec rake
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.