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?


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

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.


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.


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

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.


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.


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


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 !!


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


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

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.


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.