Вы уже активировали X, но вашему Gemfile требуется Y

128

При запуске rakeя получаю такую ​​ошибку:

Вы уже активировали рейк 0.9.2, но ваш Gemfile требует рейка 0.8.7. Рассмотрите возможность использования пакета exec.

Кажется, bundle exec rakeчто использование вместо просто rakeработает, но это лучший способ исправить это?

мин да
источник
Это также делает RVM таким отличным инструментом. Это позволит вам иметь отдельный набор драгоценных камней для каждого из этих проектов, чтобы вам не пришлось беспокоиться о том, что это произойдет снова.
rm-rf

Ответы:

85

Использование bundle exec - правильный способ сделать это.

По сути, вы обновили rake до версии 0.9.2, которая теперь конфликтует с версией, указанной в вашем Gemfile. Ранее rakeваша последняя версия соответствовала версии в вашем Gemfile, поэтому вы не получали никаких предупреждений при простом использовании rake.

Иегуда Кац (один из первых разработчиков Bundler) объясняет все это в своем блоге .

Чтобы не печатать bundle exec ...постоянно, вы можете настроить псевдоним или функцию в своей оболочке для команд, которые вы обычно используете с Bundler. Например, вот что я использую для рейка:

$ type bake
bake is a function
bake () 
{ 
    bundle exec rake "$@"
}
матовый
источник
5
Сообщение в блоге на самом деле мало что объясняет. Настоящий вопрос: почему чистый рубин не имеет правильных зависимостей и почему тогда жалуются на неправильные?
Otheus
64

Если у вас есть причина сохранить текущую версию rake (или какой-либо другой драгоценный камень, вызывающий проблему), matt правильный, лучший способ сделать это - запустить bundle exec. При этом используется версия, указанная в вашем Gemfile, вместо использования самой новой версии установленного вами гема. (у nathan.f77 есть хорошее решение ниже, если вы не хотите печатать bundle execкаждый раз, когда запускаете рейк)

В противном случае, если нет причин не обновлять рейк, можно запустить

bundle update rake

Это фактически обновит ваш Gemfile.lock, чтобы использовать новейшую версию rake вместо того, чтобы запускать bundle execкаждый раз.

Примечание: если вы запустите именно bundle updateэто, обновятся все драгоценные камни в вашем Gemfile, а не просто грабли, что, вероятно, не то, что вы хотите, потому что, если что-то сломается в вашем приложении, вы не узнаете, какое обновление драгоценного камня вызвало это.


Менее рекомендуемый способ сохранить старую версию без необходимости использования bundle exec- это удалить новые версии rake.

$ gem uninstall rake

Выберите гем для удаления:
 1. грабли-0.8.7
 2. грабли-0.9.2
 3. Все версии
> 2
Успешно удален rake-0.9.2

Это работает, но если вы работаете с несколькими приложениями, которые используют разные версии rake, это может быть проблемой, потому что вам постоянно придется устанавливать и удалять разные версии.

Райан
источник
Это сработало для меня. Почему-то была установлена ​​только одна версия (0.8.7). Так что сначала я сделал gem install rake. Потом gem uninstall rakeи выбрал 0.9.2.
B Seven
7
bundle updateтакже обновит все драгоценные камни без указанных версий до последней доступной версии. Возможно, это не то, что вам нужно. bundle update rakeбыло бы больше прецес.
Alex Neth
У меня такая же проблема с public_suffixвместо rake. К bundle update public_suffixсожалению, бег не дает никакого эффекта.
Дмитрий Зайцев
53

Пытаться bundle clean --force

Удаляет все системные жемчужины, не входящие в этот комплект.

Олег Дикусар
источник
13

В прошлый раз, когда это случилось со мной, я обновил все свои драгоценные камни. Я сделал, gem uninstall rakeи он перечислил варианты версии. Я выбрал более новую, и тогда мне больше не пришлось пользоваться bundle exec.

По сути, если вы используете, bundle execон использует ту версию гема, которая установлена ​​в вашем пакете, то есть то, что находится в Gemfile. Без bundle execнего используется версия, установленная в вашей системе по умолчанию.

paarshad
источник
8

Ooh! Статья Каца превосходна!

Мне больше всего нравится это решение:

bundle install --binstubs

так что теперь вы можете ввести

bin/rake .stuff.

Для кого-то вроде меня, который занимается разработкой приложений 2.3 и 3.0.9, я чувствую себя намного лучше.

nessur
источник
8

bundle exec правильно, но вы не хотите вводить его каждый раз.

Вы можете поместить это в свой .bashrc:

# Automatically invoke bundler for rake, if necessary.
rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }
ndbroadbent
источник
Чтобы уточнить, файл .bashrc, вероятно, находится в вашем домашнем каталоге [~ / .bashrc]. Этот файл загружается каждый раз, когда вы открываете новое окно терминала.
Райан
0

Другой способ не вводить его каждый раз - использовать Makefile, например

rake :
    bundle exec rake
qwr
источник