2009-06-04 7 views
35

Ho provato a disinstallare il datamapper utilizzando il comando gem uninstall dm-core.Devo disinstallare manualmente tutte le gemme dipendenti?

Ma sembra che anche un intero gruppo di gemelli dipendenti debba essere disinstallato.

C:\>gem uninstall dm-core 

You have requested to uninstall the gem: 
     dm-core-0.9.11 
dm-migrations-0.9.11 depends on [dm-core (= 0.9.11)] 
dm-cli-0.9.11 depends on [dm-core (= 0.9.11)] 
dm-serializer-0.9.11 depends on [dm-core (= 0.9.11)] 
dm-timestamps-0.9.11 depends on [dm-core (= 0.9.11)] 
dm-aggregates-0.9.11 depends on [dm-core (= 0.9.11)] 
dm-types-0.9.11 depends on [dm-core (= 0.9.11)] 
dm-is-tree-0.9.11 depends on [dm-core (= 0.9.11)] 
dm-observer-0.9.11 depends on [dm-core (= 0.9.11)] 
dm-validations-0.9.11 depends on [dm-core (= 0.9.11)] 
If you remove this gems, one or more dependencies will not be met. 
Continue with Uninstall? [Yn] n 
ERROR: While executing gem ... (Gem::DependencyRemovalException) 
    Uninstallation aborted due to dependent gem(s) 

Ho provato a trovare la documentazione su "gioiello di disinstallazione", ma non sembra essere un modo per disinstallare automaticamente le dipendenze:

C:\>gem help uninstall 
Usage: gem uninstall GEMNAME [GEMNAME ...] [options] 

    Options: 
    -a, --[no-]all     Uninstall all matching versions 
    -I, --[no-]ignore-dependencies Ignore dependency requirements while 
            uninstalling 
    -x, --[no-]executables   Uninstall applicable executables with 
out 
            confirmation 
    -i, --install-dir DIR   Directory to uninstall gem from 
    -n, --bindir DIR     Directory to remove binaries from 
     --[no-]user-install   Uninstall from user's home directory 
            in addition to GEM_HOME. 
    -v, --version VERSION   Specify version of gem to uninstall 
     --platform PLATFORM   Specify the platform of gem to uninst 
all 

    Common Options: 
    -h, --help      Get help on this command 
    -V, --[no-]verbose    Set the verbose level of output 
    -q, --quiet      Silence commands 
     --config-file FILE   Use this config file instead of defau 
lt 
     --backtrace     Show stack backtrace on errors 
     --debug      Turn on Ruby debugging 


    Arguments: 
    GEMNAME  name of gem to uninstall 

    Summary: 
    Uninstall gems from the local repository 

    Defaults: 
    --version '>= 0' --no-force --install-dir C:/Ruby18/lib/ruby/gems/1.8 
    --user-install 

C:\> 

mi sto perdendo qualcosa?

risposta

11

Per quanto ne so tu sei corretto, non c'è un modo semplice integrato nel comando gem per farlo.

Tuttavia, è possibile controllare gem-prune che può aiutare a ripulire il repository gem dopo aver rimosso dm-core.

http://github.com/ddollar/gem-prune/tree/master

+3

FYI, gem-prune non è più gestito e non è compatibile con le ultime versioni. – Segfault

+0

Sì, non installerò mai, mai e poi mai tutto ciò che ha dipendenze usando gem. No. – Seph

1

questo frammento di codice lo fa per me:

def gem_deps(name) 
    if `gem dependency #{name}` =~ /(Gem #{name}-.*?)(Gem|\z)/m 
    $1.split("\n").grep(/runtime\s*\)/).map do |line| 
     line[/[\w-]+/] 
    end.compact 
    else 
    [] 
    end 
end 

def gem_recursive_uninstall(name) 
    deps = gem_deps(name) 
    if deps.empty? 
    system('sudo','gem','uninstall',name) 
    else 
    puts("Uninstall #{name} with dependencies: #{deps.join(', ')}? [y/n]") 
    if gets.chomp[/y/] 
     system(*(%w{sudo gem uninstall} + [name] + deps)) 
    end 
    end 
end 

Tratto da http://github.com/cldwalker/irbfiles/blob/master/.irb/libraries/gem.rb

+0

FYI, questo non sembra ricorsivo. Sembra solo scendere di un livello, vale a dire, disinstallare le dipendenze dirette, ma non le dipendenze delle dipendenze, ecc. Ecco una [gemma di dipendenza da ricorsiva ricorsiva] (http://stackoverflow.com/questions/952836/do- soluzione i-have-to-manual-uninstall-all-dependent-gems/6727859 # 6727859). – ma11hew28

28

gem list | cut -d" " -f1 | xargs gem uninstall -aIx cancella tutte le gemme del rubino installati!

+1

Questo è in realtà pulito, ma soprattutto perché non avevo familiarità con il comando "taglia". :) Grazie per avermi mostrato! –

+0

Bello! Per rimuovere le dipendenze di rails3.1.0.rc4, ho usato questo ispirato a quello di Bruno: 'gem list | grep .rc4 | cut -d "" -f1 | xargs gem uninstall -aIx -v 3.1.0.rc4' – rchampourlier

+0

'cut' è pulito! Ecco una soluzione [gem di disinstallare la dipendenza ricorsiva] (http://stackoverflow.com/questions/952836/do-i-have-to-manually-uninstall-all-dependent-gems/6727859#6727859). – ma11hew28

5
for gem in `gem list --no-version`; do 
    gem uninstall -aIx $gem 
done 

funziona meglio per me, non so perché, ma

gem list | cut -d" " -f1 | xargs gem uninstall -aIx 

non funziona sul mio sistema come si lamenta ancora ...

ERROR: While executing gem ... (Gem::InstallError) 
    cannot uninstall, check `gem list -d some-gem-here` 
0

Basta elencare tutte le gemme vuoi disinstallare ad es gem uninstall dm-migrations dm-cli dm-observer. E cerca di gestire le tue gemme con Bundler quando possibile.

4

Il problema durante l'esecuzione di questo tipo di disinstallazioni è che vanno giù l'elenco delle gemme in ordine, quindi se una gomma non è installabile si finisce per rimanere bloccati. Esegui il seguente un paio di volte e dovrebbe rimuovere tutte le gemme a cui è permesso.

gem list | cut -d" " -f1 | sort -R | xargs -n1 gem uninstall -aIx 
+0

La chiamata 'xargs -n1' impedirà l'arresto del richiamo quando non è possibile rimuovere le gemme predefinite per un dato Ruby. –

+0

Grazie, genio ... –

-1

Se si desidera utilizzare alcune wild card per rimuovere alcune gemme (ad esempio, per rimuovere alcune gemme da uno specifico fornitore) allora si può inviare l'output dalla lista gemma di grep come illustrato di seguito

gem list --no-version | grep "opener-" | cut -d " " -f1 | xargs gem uninstall -aIx 

Il comando precedente rimuove tutte le gemme il cui nome inizia con "opener-"

+0

suo disinstallare quasi tutto il mio gioiello, non solo che inizia con "opener-" – icemelt

2

gem cleanup dovrebbe fare il trucco. Vedi here per i dettagli.