pacote de trilhos limpo

88

Depois de atualizar um pacote, você terá algumas joias que podem estar obsoletas - já que uma versão mais recente dessa joia foi instalada. Não existe tal comando no bundleexecutável ie bundle clean. Como se livrar dessas joias obsoletas?

Esta é uma tentativa de reduzir o tamanho do pacote em meu aplicativo Rails.

iGbanam
fonte

Respostas:

131

Se você estiver usando o Bundler 1.1 ou posterior, você pode usar bundle clean, assim como você imaginou que poderia. Isso é redundante se você estiver usando bundle install --path(o Bundler gerencia o local que você especificou com --path, então assume a responsabilidade pela remoção de joias desatualizadas), mas se você usou o Bundler para instalar as joias como joias do sistema, então bundle clean --forceirá deletar quaisquer joias do sistema não exigido pelo seu Gemfile. Advertência extremamente óbvia: não faça isso se tiver outros aplicativos que dependem de joias do sistema que não estão em seu Gemfile!

Pat Shaughnessy tem uma boa descrição bundle cleane outras novas adições no bundler 1.1 .

David Waller
fonte
30
Para aqueles que usam o rvm, observe que bundle clean --forceisso não afeta suas joias globais, mas apenas aquelas em seu conjunto de joias atual. Portanto, bundle clean --forceproduz o mesmo resultado que e é mais rápido do que rvm gemset emptyseguido por bundle install.
Gabe Kopley
19
AVISO DE RESPONSABILIDADE: "Bundle clean --force" pode explodir um grande número de joias se você não tomar cuidado. Essa deve ser a primeira linha desta resposta ... especialmente porque tem tantos votos. SEJA CUIDADOSO!
jerrylroberts
36

Se estiver usando RVM, você pode usar rvm gemset emptypara o gemset atual - este comando removerá todas as gems instaladas no gemset atual (o próprio gemset permanecerá no lugar). Em seguida, execute bundle installpara instalar as versões reais das joias. Também certifique-se de não deletar joias gerais como rake, bundler e assim por diante rvm gemset empty(se for o caso, instale-as manualmente via gem installantes de bundle install).

Trushkevich
fonte
22

Se você estiver usando RVM, você pode instalar suas gemas em conjuntos de gemas . Dessa forma, quando você deseja realizar uma limpeza completa, pode simplesmente remover o conjunto de joias, que por sua vez remove todas as joias instaladas nele. Sua outra opção é simplesmente desinstalar suas joias não utilizadas e executar novamente o bundle installcomando.

Como o bundler é uma ferramenta de criação de versão de gem de projeto por projeto, ele não fornece um bundle cleancomando. Isso significaria a possibilidade de remover joias associadas a outros projetos também, o que não seria desejável. Isso significa que o bundler é provavelmente a ferramenta errada a ser usada para gerenciar o diretório gem. Minha recomendação pessoal seria usar conjuntos de joias RVM para criar uma sandbox de suas joias em certos projetos ou versões de ruby.

Pan Thomakos
fonte
41
Não há necessidade de remover o gemset, você pode simplesmente digitar 'rvm gemset vazio gemset_name' e executar 'bundle install' novamente.
JAG de
Ótima explicação. Saber isso sobre bundler ajuda. Obrigado.
Volte
9
bundle clean --force fará o trabalho
marinheiro
com rvm, limpe a pasta .rvm / gems / ruby-xxxxxx / especificações se "bundle install" se recusar a baixar novamente as gemas.
Barbacan
@JAG Eu acrescentaria que você precisa 'instalar o bundler com gem' depois de limpar o gemset para poder chamar a instalação do bundle
maleta
13

Honestamente, tive problemas com dependências circulares do bundler e a melhor maneira é rm -rf .bundle. Poupe-se da dor de cabeça e use o martelo.

Tyler Brock
fonte
1
Eu tive que fazer isso para que ele parasse de me incomodar com "você deve chamar a instalação do pacote com --no-deployment". Obrigado
Kevin
2
Obrigado pela ideia. Embora para mim, usar um martelo maior ajudou. rvm implode --forcee, em seguida, reinstale o rvm
Ryan
1

Presumo que você instale gemas em vendor/bundle? Se sim, por que não deletar todas as gemas e fazer uma limpeza bundle install?

Leonid Shevtsov
fonte
meu diretório de fornecedores controla apenas os ativos e os plug-ins instalados. I'm on Rails 3.1
iGbanam
Então, qual é a razão para remover joias não utilizadas se elas não são copiadas no deploy? Eles não ocupam muito espaço.
Leonid Shevtsov
estou implantando este aplicativo Rails em uma intranet; o que significa que eu lido com os arquivos e o ambiente localmente. se você souber de alguma solução que eu possa usar para isso, compartilhe.
iGbanam
0

Apenas remova as joias obsoletas do seu Gemfile. Se você está falando sobre o Heroku (você não mencionou isso), o slug é compilado a cada nova versão, usando apenas o conteúdo atual desse arquivo.

Gareth
fonte
isso não é necessariamente para heroku. Eu quero reduzir o tamanho do próprio aplicativo Rails.
iGbanam
0

Basta executar, para limpar joias obsoletas e remover avisos de impressão após o pacote.

bundle clean --force

codevb
fonte