Du hast X bereits aktiviert, aber dein Gemfile benötigt Y.

128

Beim Ausführen rakeerhalte ich folgende Fehlermeldung:

Sie haben Rake 0.9.2 bereits aktiviert, für Ihr Gemfile ist jedoch Rake 0.8.7 erforderlich. Erwägen Sie die Verwendung von Bundle Exec.

Verwenden bundle exec rakestatt nur rakezu funktionieren scheint, aber ist es der beste Weg, dies zu beheben?

ming yeow
quelle
Dies macht RVM auch zu einem großartigen Werkzeug. Es würde Ihnen ermöglichen, für jedes dieser Projekte einen eigenen Satz von Edelsteinen zu haben, damit Sie sich keine Sorgen mehr machen müssen, dass dies erneut geschieht.
rm-rf

Antworten:

84

Verwenden bundle exec ist der richtige Weg, um dies zu tun.

Grundsätzlich passiert, dass Sie Rake auf 0.9.2 aktualisiert haben, was jetzt mit der in Ihrer Gemfile angegebenen Version in Konflikt steht. Zuvor rakestimmte die neueste Version von Ihnen mit der Version in Ihrem Gemfile überein, sodass Sie bei einfacher Verwendung keine Warnung erhielten rake.

Yehuda Katz (einer der ursprünglichen Bundler-Entwickler) erklärt alles in diesem Blog-Beitrag .

Um zu vermeiden bundle exec ..., dass Sie ständig tippen, können Sie in Ihrer Shell einen Alias ​​oder eine Funktion für Befehle einrichten, die Sie üblicherweise mit Bundler verwenden. Zum Beispiel verwende ich Folgendes für Rake:

$ type bake
bake is a function
bake () 
{ 
    bundle exec rake "$@"
}
matt
quelle
5
Der Blog-Beitrag erklärt nicht wirklich viel. Die eigentliche Frage ist: Warum bekommt der jungfräuliche Rubin nicht die richtigen Abhängigkeiten und warum beschwert er sich dann über die falschen?
Otheus
64

Wenn Sie einen Grund haben, die aktuelle Version von Rake beizubehalten (oder was auch immer ein anderer Edelstein das Problem verursacht), ist Matt korrekt. Der beste Weg, dies zu tun, ist das Ausführen bundle exec. Dies verwendet die in Ihrer Gem-Datei angegebene Version, anstatt die neueste Version des von Ihnen installierten Gems zu verwenden. (nathan.f77 hat unten eine gute Lösung, wenn Sie nicht bundle execjedes Mal tippen möchten, wenn Sie Rake ausführen.)

Andernfalls können Sie ausführen, wenn es keinen Grund gibt, Rake nicht zu aktualisieren

bundle update rake

Dadurch wird Ihr Gemfile.lock aktualisiert, um die neueste Version von Rake zu verwenden, anstatt bundle execjedes Mal ausgeführt werden zu müssen.

Hinweis: Wenn Sie nur bundle updatedies ausführen, werden alle Edelsteine ​​in Ihrer Gem-Datei aktualisiert, anstatt nur zu harken. Dies ist wahrscheinlich nicht das, was Sie möchten. Wenn in Ihrer Anwendung etwas kaputt geht, wissen Sie nicht, welches Gem-Update dies verursacht hat.


Die weniger empfohlene Methode, die ältere Version beizubehalten, ohne sie verwenden zu müssen, bundle execbesteht darin, die neueren Versionen von Rake zu deinstallieren.

$ gem deinstallieren Rechen

Wählen Sie den zu deinstallierenden Edelstein aus:
 1. Rechen-0.8.7
 2. Rechen-0.9.2
 3. Alle Versionen
> 2
Rake-0.9.2 erfolgreich deinstalliert

Dies funktioniert, aber wenn Sie mit mehreren Apps arbeiten, die unterschiedliche Versionen von Rake verwenden, kann dies schmerzhaft sein, da Sie ständig verschiedene Versionen installieren und deinstallieren müssen.

Ryan
quelle
Das hat bei mir funktioniert. Aus irgendeinem Grund wurde nur eine Version (0.8.7) installiert. Also habe ich es zuerst getan gem install rake. Dann gem uninstall rakeund wählte 0.9.2.
B Seven
7
bundle updateaktualisiert auch alle Edelsteine ​​ohne die angegebenen Versionen auf die neueste verfügbare Version. Das ist vielleicht nicht das, was Sie wollen. bundle update rakewäre mehr Precies.
Alex Neth
Ich habe das gleiche Problem mit public_suffixstatt rake. Laufen bundle update public_suffixhat leider keine Auswirkung.
Dmitri Zaitsev
53

Versuchen bundle clean --force

Es entfernt jedes Systemjuwel, das nicht in diesem Bundle enthalten ist

Oleg Dikusar
quelle
13

Das letzte Mal, als mir das passiert ist, hatte ich alle meine Edelsteine ​​aktualisiert. Ich habe eine gem uninstall rakeund es listete Versionsoptionen auf. Ich habe die neuere ausgewählt und musste sie dann nicht bundle execmehr verwenden.

Wenn Sie bundle execes verwenden, wird grundsätzlich die von Ihrem Bundle installierte Gem-Version verwendet, also was in der Gem-Datei enthalten ist. Ohne verwendet bundle execes die Version, die Ihr System standardmäßig verwendet.

paarshad
quelle
8

Oh! Der Katz-Artikel ist ausgezeichnet!

Diese Lösung gefällt mir am besten:

bundle install --binstubs

damit Sie jetzt tippen können

bin/rake .stuff.

Für jemanden wie mich, der sowohl 2.3- als auch 3.0.9-Apps entwickelt, fühle ich mich dadurch viel besser.

nessur
quelle
8

bundle exec ist richtig, aber Sie möchten es nicht jedes Mal eingeben.

Sie können dies in Ihre .bashrc einfügen:

# Automatically invoke bundler for rake, if necessary.
rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }
ndbroadbent
quelle
Zur Verdeutlichung befindet sich die .bashrc-Datei wahrscheinlich in Ihrem Home-Verzeichnis [~ / .bashrc]. Diese Datei wird jedes Mal geladen, wenn Sie ein neues Terminalfenster öffnen.
Ryan
0

Eine andere Möglichkeit, es nicht jedes Mal einzugeben, ist beispielsweise ein Makefile

rake :
    bundle exec rake
qwr
quelle