Qual é a melhor maneira de desinstalar gems de um projeto rails3?

102

Eu instalei todas as minhas joias usando o bundler através do Gemfile. Eu pensei (por engano) que se eu excluísse uma gema do meu Gemfile e executasse o 'bundle install', as gemas excluídas seriam desinstaladas. Eu olhei o arquivo de ajuda do bundler e, até onde eu posso dizer, ele não tem como desinstalar gems.

Devo usar o gem uninstall x para tudo? Isso vai confundir bundler?

Lashleigh
fonte

Respostas:

136

O Bundler é iniciado a partir do diretório raiz do seu aplicativo para garantir que todas as gemas necessárias estejam presentes para que seu aplicativo funcione. Se por algum motivo você não precisar mais de uma gema, será necessário executar o

    gem uninstall gem_name 

como você afirmou acima. Portanto, toda vez que você executar o bundler, ele verificará novamente as dependências

EDITAR - 24.12.2014

Vejo que as pessoas continuam chegando a essa questão, decidi acrescentar algo. A resposta que dei foi para o caso em que você mantém suas joias globais. Considere o uso de um gerenciador de gemas como rbenv ou rvm para manter conjuntos de gemas com escopo em projetos específicos.

Isso significa que nenhuma gema será instalada em um nível global e, portanto, quando você remove uma do Gemfile do projeto e reexecuta o pacote, obviamente, ela não será carregada em seu projeto. Em seguida, você pode executar bundle clean (com o diretório do projeto) e ele removerá do sistema todas as joias que foram instaladas uma vez do seu Gemfile (no mesmo diretório), mas neste momento não estão mais listadas lá .... longa história curta - remove joias não utilizadas.

Daniel
fonte
98

Isso desinstalará um gem instalado por bundler:

bundle exec gem uninstall GEM_NAME

Observe que isso joga

ERRO: Ao executar gem ... (NoMethodError) método indefinido `delete 'para # <Bundler :: SpecSet: 0x00000101142268>

mas a gema é realmente removida. Da próxima vez que você executar bundle installo gem, ele será reinstalado.

Phatmann
fonte
10
Para usuários RVM: você deve usar este método se tiver configurado um conjunto de joias para seu projeto específico. Executar a gem uninstall pgpartir da pasta do projeto irá desinstalar o pg do seu gemset de nível global / sistema em vez do bundler
Eric Hu
É a esse erro que você está se referindo? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
usuário664833
1 para fazer isso no contexto do pacote. gostaria que não tivesse lançado aquele erro! melhor ainda, gostaria de poder agrupar -f update gemname.
pduey
2
@EricHu não, se você estiver usando o gemset RVM. sempre que você instala uma gem com gem install xxx dentro de um gemset RVM, é lá onde ela permanece, então fazer uma desinstalação simples da gem xxx em um gemset RVM removerá a gem instalada naquele gemset e não no sistema.
Esteban Feldman
@EstebanFeldman você está certo, acho que essa foi uma mudança feita no RVM nos últimos 11 meses.
Eric Hu
21

Com as versões mais recentes do bundler, você pode usar a tarefa de limpeza:

$ bundle help clean
Usage:
    bundle clean

Options:
    [--dry-run=only print out changes, do not actually clean gems]
    [--force=forces clean even if --path is not set]
    [--no-color=Disable colorization in output]
    -V, [--verbose=Enable verbose output mode]

Cleans up unused gems in your bundler directory
$ bundle clean --dry-run --force
Would have removed actionmailer (3.1.12)
Would have removed actionmailer (3.2.0.rc2)
Would have removed actionpack (3.1.12)
Would have removed actionpack (3.2.0.rc2)
Would have removed activemodel (3.1.12)
...

editar:

Isso não é recomendado se você estiver usando um conjunto de gemas global (ou seja, todos os seus projetos mantêm suas gemas no mesmo lugar). Porém, existem algumas maneiras de manter as joias de cada projeto separadas:

  1. rvmgemsets ( http://rvm.io/gemsets/basics )
  2. bundle installcom qualquer uma das seguintes opções: --deploymentou --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova
fonte
Usando bundle clean --forceremoveu um monte de joias que eu não uso no meu projeto atual, mas uso em meus outros projetos. Eu deveria definir um caminho? Apenas bundle cleanretorna "Só pode usar bundle clean quando --path está definido ou --force está definido". Mas a --pathopção nem aparece na ajuda.
Dennis
1
Isso está correto, @Dennis. A cleantarefa realmente não faz sentido se você estiver usando um conjunto de joias global. Mas se quiser, cada um de seus projetos pode ter suas joias separadas. Você pode fazer isso via rvm gemsets ( rvm.io/gemsets/basics ) ou especificando o caminho das gems por meio da --pathopção bundle install( bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova
1

Você deve usar 'gem uninstall gem_name' para desinstalar uma gem.

Observe que se você instalou a gem em todo o sistema (ou seja, sudo bundle install), pode ser necessário especificar o diretório binário usando a opção -n, para garantir que os binários pertencentes à gem sejam removidos. Por exemplo

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin
Declan McGrath
fonte
1

Parece que resolvi isso removendo manualmente a gema do unicórnio por meio do bundler ("sudo bundler exec gem uninstall unicórnio") e, em seguida, agrupando novamente ("sudo bundle install").

Não sei por que isso aconteceu, embora a correção acima pareça funcionar.

Aaron Marks
fonte
1

Se você quiser limpar todas as suas joias e começar de novo

sudo gem clean
Douglas G. Allen
fonte