2011-10-26 17 views
69

Dopo aver aggiornato un pacchetto, si avranno alcune gemme che potrebbero essere obsolete - poiché è stata installata una versione più recente di tale gemma. Non esiste un comando di questo tipo nell'eseguibile bundle, ovvero bundle clean. Come si fa a sbarazzarsi di queste gemme obsolete?rails bundle clean

Questo è un tentativo di ridurre le dimensioni della barra nella mia app per rotaie.

risposta

113

Se si utilizza Bundler 1.1 o successivo, è possibile utilizzare bundle clean, proprio come si immaginava possibile. Questo è ridondante se si utilizza bundle install --path (Bundler gestisce la posizione specificata con --path, quindi si assume la responsabilità per la rimozione di gems obsoleti), ma se hai usato Bundler per installare le gemme come gemme di sistema, allora bundle clean --force eliminerà qualsiasi sistema gemme non richieste dal tuo Gemfile. Avvertenza chiaramente ovvia: non farlo se hai altre app che si basano su gemme di sistema che non sono nel tuo Gemfile!

Pat Shaughnessy ha una buona descrizione di bundle clean and other new additions in bundler 1.1.

+20

Per coloro che utilizzano rvm, si noti che 'bundle clean --force' non tocca le gemme globali, ma solo quelle nel proprio gemset corrente. Quindi 'bundle clean --force' produce lo stesso risultato di ed è più veloce di' rvm gemset empty' seguito da 'bundle install'. –

+15

DISCLAIMER: "Bundle clean --force" può spazzare via un gran numero di gemme se non stai attento. Questa dovrebbe essere la prima riga di questa risposta ... soprattutto perché ha così tanti voti. STAI ATTENTO! – jerrylroberts

21

Se si utilizza RVM è possibile installare le gemme in gemsets. In questo modo quando vuoi eseguire una pulizia completa puoi semplicemente rimuovere il gemset, che a sua volta rimuove tutte le gemme installate in esso. L'altra opzione è semplicemente disinstallare le gemme non utilizzate e rieseguire il comando bundle install.

Poiché bundler è pensato per essere uno strumento di versioning gem per progetto per progetto, non fornisce un comando bundle clean. Fare ciò significherebbe la possibilità di rimuovere gemme associate ad altri progetti, il che non sarebbe auspicabile. Ciò significa che bundler è probabilmente lo strumento sbagliato da utilizzare per gestire la tua directory gem. La mia raccomandazione personale sarebbe quella di usare le gemsets RVM per sandboxare le gemme in alcuni progetti o versioni ruby.

+40

Non è necessario rimuovere il GemSET, si può semplicemente digitare 'rvm GemSET vuota gemset_name' e quindi eseguire 'bundle install' di nuovo . – JAG

+0

Ottima spiegazione. Sapere che su bundler aiuta. Grazie. – Volte

+9

bundle clean --force farà il lavoro – sailor

1

Suppongo che installi gemme in vendor/bundle? Se è così, perché non cancellare solo tutte le gemme e fare una pulizia bundle install?

+0

la mia directory del venditore tiene traccia solo delle risorse e dei plugin installati. Sono su Rails 3.1 – iGbanam

+0

Quindi qual è il motivo per rimuovere le gem inutilizzate se non vengono copiate sulla distribuzione? Non occupano molto spazio. –

+0

sto distribuendo questa app per rails su una intranet; nel senso che gestisco localmente i file e l'ambiente. se sai delle soluzioni che posso usare per questo, per favore condividi. – iGbanam

0

Basta rimuovere le gemme obsolete dal tuo Gemfile. Se stai parlando di Heroku (non l'hai menzionato), lo slug viene compilato ogni nuova release, usando solo il contenuto corrente di quel file.

+0

questo non è necessariamente per heroku. Voglio ridurre la dimensione dell'app stessa. – iGbanam

10

Onestamente, ho avuto problemi con le dipendenze circolari di bundle e il modo migliore per andare è rm -rf .bundle. Salva te stesso il mal di testa e basta usare il martello.

+0

in realtà non mi ha aiutato, lo stesso errore. – holms

+1

Ho dovuto fare questo per fargli smettere di informarmi di "devi chiamare bundle install con --no-deployment". Grazie – Kevin

+2

Grazie per l'idea. Anche se per me è stato utile usare un martello più grande. 'rvm implode --force' e quindi reinstallare rvm – Ryan

30

Se si utilizza RVM, è possibile utilizzare rvm gemset empty per il gemset corrente: questo comando rimuoverà tutte le gemme installate sul gemset corrente (gemset stesso rimarrà al suo posto). Quindi esegui bundle install per installare le versioni effettive delle gemme. Assicurati inoltre di non eliminare tali gem generici come rake, bundler e così via durante il rvm gemset empty (se è il caso, quindi installali manualmente tramite gem install prima di bundle install).