Você já ativou o X, mas seu Gemfile requer Y


128

Ao executar rake, recebo este erro:

Você já ativou o rake 0.9.2, mas seu Gemfile requer o rake 0.8.7. Considere usar o pacote executável.

Usar em bundle exec rakevez de apenas rakeparece funcionar, mas é a melhor maneira de corrigir isso?


É também isso que faz do RVM uma ferramenta tão boa. Isso permitiria que você tivesse um conjunto separado de gemas para cada um desses projetos, para que você não tivesse que se preocupar com isso acontecendo novamente.
Rm-rf

Respostas:


84

Usar bundle exec é o caminho certo para fazer isso.

Basicamente, o que está acontecendo é que você atualizou o rake para 0.9.2, que agora entra em conflito com a versão especificada no seu Gemfile. Anteriormente, a versão mais recente de rakevocê correspondia à versão do seu Gemfile, portanto, você não recebia nenhum aviso ao usá-lo rake.

Yehuda Katz (um dos desenvolvedores originais do Bundler) explica tudo nesta postagem do blog .

Para evitar digitar bundle exec ...o tempo todo, você pode configurar um alias ou função em seu shell para os comandos que normalmente usa com o Bundler. Por exemplo, é isso que eu uso para o Rake:

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

5
O post do blog não explica muito. A verdadeira questão é: por que o rubi virgem não obtém as dependências corretas e por que então reclama de ter as erradas?
Otheus 19/07

64

Se você tiver um motivo para manter a versão atual do rake (ou qualquer outra gema que esteja causando o problema), matt está correto, a melhor maneira de fazer isso é executar bundle exec. Isso usa a versão especificada no seu Gemfile em vez de usar a versão mais recente da gema que você instalou. (nathan.f77 tem uma boa solução abaixo se você não quiser digitar bundle exectoda vez que executar o rake)

Caso contrário, se não houver motivos para não atualizar o rake, você poderá executar

bundle update rake

Na verdade, isso atualizará o seu Gemfile.lock para usar a versão mais recente do rake, em vez de ter que executar bundle execsempre.

Nota: se você executar exatamente bundle updateisso, atualizará todas as jóias no seu Gemfile em vez de apenas o rake, o que provavelmente não é o que você deseja, porque se algo quebrar no seu aplicativo, você não saberá qual atualização de jóias causou.


A maneira menos recomendada de manter a versão mais antiga sem precisar usar bundle execé desinstalar as versões mais recentes do rake.

rake de desinstalação do $ gem

Selecione gem para desinstalar:
 1. rake-0.8.7
 2. rake-0.9.2
 3. Todas as versões
> 2
Rake-0.9.2 desinstalado com sucesso

Isso funciona, mas se você estiver trabalhando com vários aplicativos que usam versões diferentes do rake, isso pode ser complicado, pois você precisará constantemente instalar e desinstalar versões diferentes.


Isso funcionou para mim. Por algum motivo, havia apenas uma versão (0.8.7) instalada. Então, primeiro eu fiz gem install rake. Então gem uninstall rakee escolha 0.9.2.
B Seven

7
bundle updatetambém atualizará quaisquer gemas sem versões especificadas para a versão mais recente disponível. Isso pode não ser o que você deseja. bundle update rakeSeria mais precies.
Alex Neth

Eu tenho o mesmo problema com em public_suffixvez de rake. Correr bundle update public_suffixnão tem efeito, infelizmente.
Dmitri Zaitsev

53

Experimentar bundle clean --force

Remove todas as gemas do sistema que não estão neste pacote


13

A última vez que isso aconteceu comigo, eu atualizei todas as minhas jóias. Eu fiz um gem uninstall rakee listou as opções de versão. Escolhi o mais novo e depois não bundle execprecisei mais usá-lo .

Basicamente, se você usá- bundle execlo, usa qualquer versão do gem instalada pelo seu pacote, então o que está no Gemfile. Sem bundle execele, usa a versão padrão do seu sistema.


8

Ooh! O artigo da Katz é excelente!

Eu gosto desta solução da melhor maneira:

bundle install --binstubs

agora você pode digitar

bin/rake .stuff.

Para alguém como eu, que está desenvolvendo aplicativos 2.3 e 3.0.9, isso me faz sentir muito melhor.


8

bundle exec está correto, mas você não deseja digitá-lo sempre.

Você pode colocar isso no seu .bashrc:

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

Para esclarecer, o arquivo .bashrc provavelmente está localizado em seu diretório pessoal [~ / .bashrc]. Este arquivo é carregado toda vez que você abre uma nova janela do terminal.
23712 Ryan

0

Outra maneira de não digitá-lo toda vez é com um Makefile, por exemplo

rake :
    bundle exec rake
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.