Alle installierten Gems unter OSX deinstallieren?

177

Es gibt Fälle, in denen ich alle vorherigen Gem-Installationen zurücksetzen und deinstallieren möchte.

Zum Beispiel musste ich einem Freund helfen, seine Rails-Entwicklungsmaschine für die Verwendung von RVM zu migrieren. Da sie das System zuvor systemweit verwendet hatten gem, hatte er bei der Arbeit mit mehreren Projekten viele Kopfschmerzen. Im Wesentlichen war er das Aushängeschild eines RVM-Konvertiten.

Wie kann ich alle Edelsteine ​​auf seinem OSX-System elegant deinstallieren?

crftr
quelle
1
Heutzutage ist das nicht mehr nötig. RVM weiß, wo Sie nach den Edelsteinen suchen müssen, nachdem Sie zur richtigen Ruby-Version gewechselt haben.
Franklin Yu
1
yes Y | gem uninstall -a -I
Stopanko
Nur eine kurze Nachricht an @FranklinYu - das ist nicht immer der Fall. Ich habe Instanzen hat , wo eine global installierte Kopie von Nokogiri immer zu sein schien Präzedenzfall über die RVM gemset nehmen, und das global man hatte deinstalliert werden.
Nathan Crause
@ NathanCrause Dann ist es ein Fehler in RVM und sollte gemeldet werden. Ich bin mir ziemlich sicher, dass dies nicht das beabsichtigte Verhalten von RVM ist.
Franklin Yu
@FranklinYu Sie haben Recht, aber bis ein solches Problem behoben ist, besteht immer noch die Notwendigkeit, alle Edelsteine ​​zu entfernen. Ich bezog mich nur auf den Punkt, dass es "unnötig" sei, was in einer idealen Situation zutreffen würde, aber hey, die Dinge laufen die ganze Zeit seitwärts.
Nathan Crause

Antworten:

426

Rubygems> = 2.1.0

gem uninstall -aIx

aEntfernt alle Versionen,
Iignoriert Abhängigkeiten und
xausführbare Dateien

Rubgems <2.1.0

for i in `gem list --no-versions`; do gem uninstall -aIx $i; done
crftr
quelle
1
Duh, du hast mich auf die Geschwindigkeit geschlagen :)
Romain
3
Dann möchten Sie natürlich eine vernünftige Liste von Standardedelsteinen neu installieren, die für mich lautet: "Edelsteininstallationsbündler json minitest rake rdoc"
Wil Moore III
5
Edelsteinliste | cut -d "" -f1 | sudo xargs gem deinstallieren -Iax -worked for me
lesyk
5
Funktioniert nicht: ERROR: While executing gem ... (Gem::InstallError) gem "test-unit" cannot be uninstalled because it is a default gem(gem 2.0.3)
M. Anthony Aiello
@Anthony Obwohl dies ein bisschen gefährlich ist, können Sie Fehler mitfor i in `gem list --no-versions`; do gem uninstall -aIx $i 2>/dev/null; done
Darren Cheng
46

Sie können auch eine neue Gem-Datei erstellen und ausführen bundle clean --force. Dadurch werden alle anderen Edelsteine ​​entfernt, die nicht in der neuen Gemfile enthalten sind.

bswinnerton
quelle
3
Dies ist sehr nützlich :)
user1190286
1
Beste Antwort, da das Testgerät nicht deinstalliert werden kann und den Prozess abbricht.
Westonplatter
2
Ja, das ist die beste Antwort. Ich denke, OP sollte diesen Beitrag 2.0.0 wählen.
TheTuxRacer
2
Dies funktioniert sicherlich für mich und ist viel eleganter als andere Versionen
Crispen Smith
29

Eine leichteste andere Version, die den Schnittschritt überspringt und die Option '--no-version' nutzt:

gem list --no-version |xargs gem uninstall -ax

Da Sie alles entfernen, sehe ich keine Notwendigkeit für die Option "Ich". Immer wenn der Edelstein entfernt wird, ist es in Ordnung.

Thiago Ganzarolli
quelle
1
sudosollte nicht notwendig sein, wenn die Edelsteine ​​von einem normalen Benutzer installiert wurden.
Sampablokuper
Siehe meine Antwort aus einem Grund, warum ich abgelehnt habe. Ich wollte hier kommentieren, aber Kommentare erlauben keine Zeilen ...
Aercolino
gut, kann viele Edelsteine ​​entfernen, aber etwas dose`t es nicht wie Bündel, Rechen, rvm
kühlsten
Sehr elegant, scheitert jedoch an der Unfähigkeit, Standardedelsteine ​​zu entfernen. Schlagen Sie stattdessen die Lösung von
crftr vor
11

Stellen Sie zunächst sicher, dass Sie mindestens Gem Version 2.1.0 haben

gem update --system
gem --version
# 2.6.4

Zum Deinstallieren einfach ausführen:

gem uninstall --all

Möglicherweise müssen Sie den folgenden sudoBefehl verwenden:

sudo gem uninstall --all
sammeln
quelle
10

Benutze das eine oder das andere

$ gem list --no-version | xargs gem uninstall -ax

oder

$ sudo gem list --no-version | xargs sudo gem uninstall -ax

Je nachdem, was Sie möchten, müssen Sie möglicherweise beide ausführen, da "Edelsteinliste" und "Sudo-Edelsteinliste" unabhängige Listen bereitstellen.

Mischen Sie keine normale "Gem-Liste" mit einer sudo-ed "Gem-Deinstallation" oder umgekehrt, da Sie sonst möglicherweise sudo-installierte Gems (erstere) deinstallieren oder viele Fehler (letztere) erhalten.

Aercolino
quelle
Sie haben Recht, ich habe meine Antwort bearbeitet, um sudo auszuschließen. Für beide Versionen können sich Benutzer auf Ihre Antwort verlassen.
Thiago Ganzarolli
9

Wenn Sie Rubygems Version 2.1.0 oder höher verwenden, können Sie Folgendes versuchen : gem uninstall --all.

rrrub
quelle
3
Es sollte "Edelstein" sein, nicht "Edelsteine".
Sammeln Sie
6

Wenn Sie es gerne mit Rubin machen:

ruby -e "`gem list`.split(/$/).each { |line| puts `gem uninstall -Iax #{line.split(' ')[0]}` unless line.strip.empty? }"

Prost

Haris Krajina
quelle
Ich erhalte eine Fehlermeldung: FEHLER: Während der Ausführung von gem ... (Gem :: CommandLineError) Bitte geben Sie mindestens einen Gem-Namen an (z. B. gem build GEMNAME)
mbdev
1
@mbdev Behoben, hehe bietet Unterstützung für meine Antworten auf Stack Overflow :)
Haris Krajina
Dies ist insofern praktisch, als es unter Windows funktioniert, wo die Befehlsshell ... nicht gut ist.
AdamC
5

Rubygems> = 2.1.0

gem uninstall -aIx

Wenn das Terminal unter dem Fehler zurückkehrt

ERROR:  While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

Schreiben Sie dann den obigen Befehl wie folgt

sudo gem uninstall -aIx

Und geben Sie Ihr Mac OS Account Passwort ein. Fertig !!

Kirtikumar A.
quelle
5

Und für diejenigen unter Ihnen, die hier sind, weil Sie alle Edelsteine ​​mit einem bestimmten Präfix entfernen möchten ( ähm, ich sehe Sie aws-sdk an!), Können Sie so etwas ausführen:

gem list --no-version | grep "aws-sdk-" | xargs gem uninstall -aIx

Offensichtlich in Ihre Anfrage anstelle von aws-sdk-. Sie benötigen das -Idort, um Abhängigkeiten zu ignorieren.

Angenommene Form Andos frühere Antwort

Trevor Elwell
quelle
4

Der einzige Befehl hat mir geholfen, alle Edelsteine ​​zu bereinigen und Standard-Edelsteine ​​zu ignorieren, die nicht deinstalliert werden können

for x in `gem list --no-versions`; do gem uninstall $x -a -x -I; done
Attenzione
quelle
2

Ich habe das vor nicht allzu langer Zeit gemacht (gleiche RVM-Umschalter-Situation für Aushängeschilder):

gem list | cut -d" " -f1 | sudo xargs gem uninstall -Iax

Nimmt die Liste aller Edelsteine ​​(einschließlich Versionsmaterial), schneidet sie so, dass nur der Edelsteinname erhalten bleibt, und deinstalliert dann alle Versionen solcher Edelsteine.

Dies sudoist nur nützlich, wenn Sie Edelsteine ​​systemweit installiert haben, und sollte nicht enthalten sein, es sei denn, dies ist erforderlich.

Romain
quelle
1

Beim Versuch, als root installierte Gems zu entfernen, scheint xargs anzuhalten, wenn beim Versuch, ein Standard-Gem zu deinstallieren, ein Fehler auftritt:

sudo gem list | cut -d" " -f1 | xargs gem uninstall -aIx
# ERROR:  While executing gem ... (Gem::InstallError)
#    gem "test-unit" cannot be uninstalled because it is a default gem


Dies wird nicht für alle funktionieren, aber hier ist, was ich stattdessen verwendet habe:

sudo for gem (`gem list | cut -d" " -f1`); do gem uninstall $gem -aIx; done
Zaz
quelle
1
gem list --no-version | grep -v -e 'psych' -e 'rdoc' -e 'openssl' -e 'json' -e 'io-console' -e 'bigdecimal' | xargs sudo gem uninstall -ax

grep schließt hier Standardedelsteine ​​aus. Alle anderen Edelsteine ​​werden deinstalliert. Sie können es auch voranstellen, sudofalls Sie Berechtigungsprobleme erhalten.

Moeabdol
quelle