Was ist der beste Weg, um Edelsteine ​​aus einem Rails3-Projekt zu deinstallieren?

102

Ich habe alle meine Edelsteine ​​mit Bundler über die Gemfile installiert. Ich dachte (fälschlicherweise), dass die gelöschten Edelsteine ​​deinstalliert würden, wenn ich einen Edelstein aus meiner Gemfile lösche und "Bundle-Installation" ausführen würde. Ich habe mir die Bundler-Hilfedatei angesehen und soweit ich das beurteilen kann, gibt es keine Möglichkeit, Gems zu deinstallieren.

Benutze ich einfach gem uninstall x für alles? Wird das Bundler verwirren?

Lashleigh
quelle

Antworten:

136

Bundler wird aus dem Stammverzeichnis Ihrer App gestartet, um sicherzustellen, dass alle erforderlichen Edelsteine ​​vorhanden sind, damit Ihre App funktioniert. Wenn Sie aus irgendeinem Grund keinen Edelstein mehr benötigen, müssen Sie den ausführen

    gem uninstall gem_name 

Wie oben angegeben. Jedes Mal, wenn Sie den Bundler ausführen, werden die Abhängigkeiten erneut überprüft

EDIT - 24.12.2014

Ich sehe, dass die Leute immer wieder auf diese Frage kommen. Ich habe beschlossen, etwas hinzuzufügen. Die Antwort, die ich gab, war für den Fall, dass Sie Ihre Edelsteine ​​global pflegen. Verwenden Sie einen Edelstein-Manager wie rbenv oder rvm, um Edelsteinsätze für bestimmte Projekte zu verwenden.

Dies bedeutet, dass auf globaler Ebene keine Gems installiert werden. Wenn Sie also eines aus der Gemfile Ihres Projekts entfernen und das Bundle erneut ausführen, wird es offensichtlich nicht in Ihr Projekt geladen. Dann können Sie Bundle Clean (mit dem Projektverzeichnis) ausführen und alle Edelsteine, die einmal aus Ihrer Gemfile (im selben Verzeichnis) installiert wurden, aber zu diesem Zeitpunkt dort nicht mehr aufgeführt sind, aus dem System entfernen. lange Rede kurzer Sinn - es entfernt unbenutzte Edelsteine.

Daniel
quelle
98

Dadurch wird ein vom Bundler installiertes Juwel deinstalliert:

bundle exec gem uninstall GEM_NAME

Beachten Sie, dass dies wirft

FEHLER: Während der Ausführung von gem ... (NoMethodError) undefinierte Methode `delete 'für # <Bundler :: SpecSet: 0x00000101142268>

aber der Edelstein wird tatsächlich entfernt. Wenn Sie das nächste Mal ausführen, wird bundle installder Edelstein neu installiert.

Phatmann
quelle
10
Für RVM-Benutzer: Sie müssen diese Methode verwenden, wenn Sie ein Gemset für Ihr bestimmtes Projekt eingerichtet haben. Wenn Sie gem uninstall pgaus dem Projektordner ausführen, wird pg von Ihrem Gemset auf globaler / Systemebene anstelle des Bundlers deinstalliert
Eric Hu
Ist dies der Fehler, auf den Sie sich beziehen? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833
+1 dafür im Bundle-Kontext. Ich wünschte, es hätte diesen Fehler nicht ausgelöst! Besser noch, ich wünschte, ich könnte -f Update Gemname bündeln.
pduey
2
@EricHu nicht, wenn Sie das RVM-Gemset verwenden. Wenn Sie einen Edelstein mit Edelstein installieren, installieren Sie xxx in einem RVM-Gemset. Dort bleibt er. Wenn Sie also xxx auf einem RVM-Gemset deinstallieren, wird der auf diesem Gemset installierte Edelstein und nicht der Systemedelstein entfernt.
Esteban Feldman
@EstebanFeldman Sie haben Recht, ich denke, dies war eine Änderung an RVM in den letzten 11 Monaten.
Eric Hu
21

Mit neueren Versionen von Bundler können Sie die Bereinigungsaufgabe verwenden:

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

bearbeiten:

Dies wird nicht empfohlen, wenn Sie ein globales Gemset verwenden (dh alle Ihre Projekte behalten ihre Gems am selben Ort). Es gibt jedoch nur wenige Möglichkeiten, die Edelsteine ​​jedes Projekts getrennt zu halten:

  1. rvmgemsets ( http://rvm.io/gemsets/basics )
  2. bundle installmit einer der folgenden Optionen: --deploymentoder --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova
quelle
Durch bundle clean --forceEntfernen wurden einige Edelsteine ​​entfernt, die ich in meinem aktuellen Projekt nicht verwende, aber in meinen anderen Projekten verwende. Sollte ich einen Weg setzen? Nur bundle cleangibt „nur Bündel sauber verwenden können , wenn --path gesetzt oder --force gesetzt“. Die --pathOption wird jedoch nicht einmal in der Hilfe angezeigt.
Dennis
1
Das ist richtig @Dennis. Die cleanAufgabe ist nicht wirklich sinnvoll, wenn Sie ein globales Gemset verwenden. Wenn Sie möchten, kann jedes Ihrer Projekte seine eigenen Juwelen haben. Sie können dies entweder über rvm gemsets ( rvm.io/gemsets/basics ) oder durch Angabe des Edelsteinpfads über die --pathOption bundle install( bundler.io/v1.3/man/bundle-install.1.html )
Evgenia
1

Sie müssen 'gem uninstall gem_name' verwenden, um einen Gem zu deinstallieren.

Beachten Sie, dass Sie bei der systemweiten Installation des Gems (dh der Installation des Sudo-Bundles) möglicherweise das Binärverzeichnis mit der Option -n angeben müssen, um sicherzustellen, dass die zum Gem gehörenden Binärdateien entfernt werden. Beispielsweise

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin
Declan McGrath
quelle
1

Ich schien dies zu lösen, indem ich das Einhorn-Gem manuell über den Bundler ("sudo bundler exec gem uninstall unicorn") entfernte und dann neu bündelte ("sudo bundle install").

Ich bin mir nicht sicher, warum es passiert ist, obwohl das obige Update zu funktionieren scheint.

Aaron Marks
quelle
1

Wenn Sie alle Ihre Edelsteine ​​aufräumen und von vorne beginnen möchten

sudo gem clean
Douglas G. Allen
quelle