Qual è il modo migliore per disinstallare gems da un progetto rails3?


102

Ho installato tutte le mie gemme utilizzando il bundler tramite Gemfile. Ho pensato (erroneamente) che se avessi cancellato una gemma dal mio Gemfile e avessi eseguito "installazione bundle", le gemme eliminate sarebbero state disinstallate. Ho esaminato il file della guida del bundler e, per quanto ne so, non ha un modo per disinstallare gems.

Uso solo gem disinstalla x per tutto? Questo confonderà il bundler?

Risposte:


136

Bundler viene avviato dalla directory principale della tua app in modo da assicurarsi che tutte le gemme necessarie siano presenti per far funzionare la tua app.Se per qualche motivo non hai più bisogno di una gemma, dovrai eseguire il

    gem uninstall gem_name 

come hai affermato sopra, quindi ogni volta che esegui bundler ricontrollerà le dipendenze

MODIFICA - 24.12.2014

Vedo che le persone continuano a venire a questa domanda, ho deciso di aggiungere qualcosina. La risposta che ho dato è stata per il caso in cui mantieni le tue gemme globali. Prendi in considerazione l'utilizzo di un gestore di gemme come rbenv o rvm per mantenere i set di gemme mirati a progetti specifici.

Ciò significa che nessuna gemma verrà installata a livello globale e quindi quando ne rimuovi una dal Gemfile del tuo progetto e riesegui il bundle, ovviamente, non verrà caricata nel tuo progetto. Quindi, puoi eseguire bundle clean (con la dir del progetto) e rimuoverà dal sistema tutte le gemme che una volta erano installate dal tuo Gemfile (nella stessa directory) ma in questo momento non sono più elencate lì .... Per farla breve: rimuove le gemme inutilizzate.


98

Questo disinstallerà una gemma installata dal bundler:

bundle exec gem uninstall GEM_NAME

Nota che questo genera

ERRORE: durante l'esecuzione di gem ... (NoMethodError) metodo non definito `delete 'per # <Bundler :: SpecSet: 0x00000101142268>

ma la gemma viene effettivamente rimossa. La prossima volta che esegui bundle installla gemma verrà reinstallata.


10
Per gli utenti RVM: devi usare questo metodo se hai impostato un gemset per il tuo particolare progetto. L'esecuzione gem uninstall pgdalla cartella del progetto disinstallerà pg dal tuo gemset a livello globale / di sistema invece di quello del bundler
Eric Hu

È questo l'errore a cui ti riferisci? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833

+1 per averlo fatto nel contesto del bundle. vorrei che non avesse generato quell'errore! meglio ancora, vorrei poter raggruppare -f update gemname.
pduey

2
@EricHu no se stai usando il gemset RVM. ogni volta che installi una gemma con gem install xxx all'interno di una gemset RVM, è lì che rimane, quindi eseguire una semplice disinstallazione di gem xxx su una gemset RVM rimuoverà la gem installata su quella gemset e non quella di sistema.
Esteban Feldman

@EstebanFeldman hai ragione, penso che questa sia stata una modifica apportata a RVM negli ultimi 11 mesi.
Eric Hu

21

Con le versioni più recenti del bundler puoi utilizzare l'attività pulita:

$ 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)
...

modificare:

Questo non è raccomandato se stai usando un gemset globale (cioè - tutti i tuoi progetti mantengono le loro gemme nello stesso posto). Tuttavia, ci sono alcuni modi per mantenere separate le gemme di ogni progetto:

  1. rvmgemsets ( http://rvm.io/gemsets/basics )
  2. bundle installcon una delle seguenti opzioni: --deploymento --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )

Usando bundle clean --forceho rimosso un mucchio di gemme che non uso nel mio progetto attuale ma che uso negli altri miei progetti. Avrei dovuto impostare un percorso? bundle cleanRestituisce solo "Può usare bundle clean solo quando --path è impostato o --force è impostato". Ma l' --pathopzione non appare nemmeno nella guida.
Dennis

1
È corretto @Dennis. Il cleancompito non ha davvero senso se stai usando un gemset globale. Ma se vuoi, ognuno dei tuoi progetti può avere le sue gemme separate. Puoi farlo tramite rvm gemsets ( rvm.io/gemsets/basics ) o specificando il percorso delle gemme tramite l' --pathopzione bundle install( bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova

1

Devi usare 'gem uninstall gem_name' per disinstallare una gemma.

Nota che se hai installato gem a livello di sistema (es. Sudo bundle install), potresti dover specificare la directory binaria usando l'opzione -n, per assicurarti che i binari appartenenti alla gemma vengano rimossi. Per esempio

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin

1

Mi è sembrato di risolvere questo problema rimuovendo manualmente la gemma unicorno tramite bundler ("sudo bundler exec gem disinstalla unicorno"), quindi rebundling ("sudo bundle install").

Non sono sicuro del motivo per cui sia successo, anche se la correzione sopra sembra funzionare.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.