Ви вже активували X, але ваш Gemfile вимагає Y


128

Під час запуску rakeя отримую цю помилку:

Ви вже активували граблі 0.9.2, але ваш Gemfile потребує граблі 0.8.7. Подумайте про використання пакету exec.

Використання bundle exec rakeзамість просто rakeздається працює, але чи це найкращий спосіб виправити це?


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

Відповіді:


84

Використання bundle exec - це правильний спосіб зробити це.

В основному, це те, що ви оновили рейку до 0.9.2, що тепер суперечить версії, зазначеній у вашому Gemfile. Раніше остання версія rakeви відповідала версії вашого Gemfile, тому ви не отримали жодного попередження при простому використанні rake.

Єгуда Кац (один з оригінальних розробників Bundler) пояснює все це у цій публікації в блозі .

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

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

5
Повідомлення в блозі насправді не пояснює багато. Справжнє питання: чому невільний рубін не отримує правильних залежностей і чому тоді скаржиться на неправильні?
Отей

64

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

В іншому випадку, якщо немає причин не оновлювати рейку, можна запустити

bundle update rake

Це фактично оновить ваш Gemfile.lock, щоб використовувати найновішу версію рейку, а не bundle execщоразу запускати .

Примітка: якщо ви запускаєте саме bundle updateце, то оновите всі дорогоцінні камені у вашому Gemfile, а не просто граблі, що, мабуть, не те, що ви хочете, тому що якщо у вашій програмі щось зламається, ви не знатимете, яке оновлення дорогоцінного каміння спричинило це.


Менш рекомендований спосіб зберегти старішу версію без використання bundle exec- це видалити новіші версії rake.

$ gem видалити граблі

Виберіть дорогоцінний камінь для видалення:
 1. граблі-0.8.7
 2. граблі-0.9.2
 3. Усі версії
> 2
Успішно видалено граблі-0.9.2

Це працює, але якщо ви працюєте з декількома програмами, які використовують різні версії рейку, це може бути болем, оскільки вам доведеться постійно встановлювати та видаляти різні версії.


Це працювало для мене. Чомусь було встановлено лише одну версію (0.8.7). Так спочатку я зробив gem install rake. Потім gem uninstall rakeі вибрали 0,9.2.
B Сім

7
bundle updateтакож оновить будь-які дорогоцінні камені без версій, вказаних на останню доступну версію. Це може бути не те, що ви хочете. bundle update rakeбуло б більше прецій.
Алекс Нет

У мене така ж проблема, а public_suffixне з rake. Біг bundle update public_suffix, на жаль, не має ефекту.
Дмитро Зайцев

53

Спробуйте bundle clean --force

Це видаляє кожен дорогоцінний камінь, який не знаходиться в цьому пакеті


13

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

В основному, якщо ви використовуєте, bundle execвін використовує будь-яку версію дорогоцінних каменів, встановлену вашим пакетом, так що є в Gemfile. Без bundle execнього використовується будь-яка версія, яка є системою за замовчуванням.


8

О-о! Стаття про Кац - відмінна!

Найкраще мені подобається це рішення:

bundle install --binstubs

так що тепер ви можете вводити текст

bin/rake .stuff.

Для когось, як я, який розробляє додатки 2.3 та 3.0.9, це робить мене набагато краще.


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

Для уточнення, .bashrc файл, ймовірно, знаходиться у вашому домашньому каталозі [~ / .bashrc]. Цей файл завантажується щоразу, коли ви відкриваєте нове вікно терміналу.
Райан

0

Інший спосіб не вводити його кожен раз, наприклад, за допомогою Makefile

rake :
    bundle exec rake
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.