Aktywowałeś już X, ale twój Gemfile wymaga Y

128

Podczas pracy rakepojawia się ten błąd:

Aktywowałeś już rake 0.9.2, ale twój Gemfile wymaga prowizji 0.8.7. Rozważ użycie pakietu exec.

Używanie bundle exec rakezamiast po prostu rakewydaje się działać, ale czy jest to najlepszy sposób, aby to naprawić?

ming yeow
źródło
To także sprawia, że RVM jest tak wspaniałym narzędziem. Pozwoliłoby ci to mieć oddzielny zestaw klejnotów dla każdego z tych projektów, więc nie musisz się martwić, że to się powtórzy.
rm-rf

Odpowiedzi:

84

Używanie bundle exec to właściwy sposób na zrobienie tego.

Zasadniczo dzieje się tak, że zaktualizowałeś rake do 0.9.2, co teraz koliduje z wersją określoną w twoim Gemfile. Poprzednio rakeTwoja ostatnia wersja pasowała do wersji w twoim Gemfile, więc nie otrzymałeś żadnego ostrzeżenia podczas prostego używania rake.

Yehuda Katz (jeden z pierwszych deweloperów Bundler) wyjaśnia to wszystko w tym poście na blogu .

Aby uniknąć ciągłego wpisywania bundle exec ..., możesz ustawić w powłoce alias lub funkcję dla poleceń, których często używasz w programie Bundler. Na przykład to, czego używam do Rake:

$ type bake
bake is a function
bake () 
{ 
    bundle exec rake "$@"
}
matowe
źródło
5
Post na blogu tak naprawdę niewiele wyjaśnia. Prawdziwe pytanie brzmi: dlaczego nie dziewica rubin uzyskać odpowiednie zależności i dlaczego potem narzekać mając te niewłaściwe?
Otheus
64

Jeśli masz powód, aby zachować aktualną wersję rake (lub inny klejnot, który powoduje problem), mat ma rację, najlepszym sposobem na to jest bieganie bundle exec. Używa wersji określonej w pliku Gemfile zamiast najnowszej wersji zainstalowanego klejnotu. (nathan.f77 ma poniżej dobre rozwiązanie, jeśli nie chcesz pisać za bundle execkażdym razem, gdy uruchamiasz rake)

W przeciwnym razie, jeśli nie ma powodu, aby nie aktualizować prowizji, możesz uruchomić

bundle update rake

To faktycznie zaktualizuje twój Gemfile.lock, aby używał najnowszej wersji rake, zamiast konieczności uruchamiania za bundle execkażdym razem.

Uwaga: jeśli uruchomisz tylko bundle updateto, zaktualizujesz wszystkie klejnoty w twoim Gemfile zamiast tylko rake'u, co prawdopodobnie nie jest tym, czego chcesz, ponieważ jeśli coś się zepsuje w twojej aplikacji, nie będziesz wiedział, która aktualizacja klejnotów to spowodowała.


Mniej zalecanym sposobem na zachowanie starszej wersji bez konieczności używania bundle execjest odinstalowanie nowszych wersji rake.

$ gem odinstaluj rake

Wybierz klejnot do odinstalowania:
 1. rake-0.8.7
 2. rake-0.9.2
 3. Wszystkie wersje
> 2
Pomyślnie odinstalowano rake-0.9.2

To działa, ale jeśli pracujesz z wieloma aplikacjami, które używają różnych wersji rake, może to być uciążliwe, ponieważ będziesz musiał ciągle instalować i odinstalowywać różne wersje.

Ryan
źródło
To zadziałało dla mnie. Z jakiegoś powodu była zainstalowana tylko jedna wersja (0.8.7). Więc najpierw zrobiłem gem install rake. Następnie gem uninstall rakewybraliśmy 0.9.2.
B Seven
7
bundle updatezaktualizuje również wszystkie klejnoty bez określonej wersji do najnowszej dostępnej wersji. To może nie być to, czego chcesz. bundle update rakebyłoby więcej cen.
Alex Neth
Mam ten sam problem z public_suffixzamiast rake. Bieganie bundle update public_suffixniestety nie daje efektu.
Dmitri Zaitsev
53

Próbować bundle clean --force

Usuwa wszystkie klejnoty systemowe, których nie ma w tym pakiecie

Oleg Dikusar
źródło
13

Ostatnim razem, gdy mi się to przydarzyło, zaktualizowałem wszystkie moje klejnoty. Zrobiłem gem uninstall rakei wymieniłem opcje wersji. Wybrałem nowszy, a potem nie musiałem bundle execjuż używać .

Zasadniczo, jeśli używasz bundle exec, używa dowolnej wersji klejnotu zainstalowanej w twoim pakiecie, więc co jest w Gemfile. Bez bundle execniego używa domyślnej wersji systemu.

paarshad
źródło
8

Ooh! Artykuł Katz jest doskonały!

Najbardziej podoba mi się to rozwiązanie:

bundle install --binstubs

aby móc teraz pisać

bin/rake .stuff.

Dla kogoś takiego jak ja, który tworzy aplikacje 2.3 i 3.0.9, czuję się o wiele lepiej.

nessur
źródło
8

bundle exec jest poprawne, ale nie chcesz go wpisywać za każdym razem.

Możesz umieścić to w swoim .bashrc:

# Automatically invoke bundler for rake, if necessary.
rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }
ndbroadbent
źródło
Aby wyjaśnić, plik .bashrc prawdopodobnie znajduje się w twoim katalogu domowym [~ / .bashrc]. Ten plik jest ładowany za każdym razem, gdy otwierasz nowe okno terminala.
Ryan
0

Innym sposobem, aby nie wpisywać go za każdym razem, jest na przykład Makefile

rake :
    bundle exec rake
qwr
źródło