Jaki jest najlepszy sposób na odinstalowanie klejnotów z projektu rails3?

102

Zainstalowałem wszystkie moje klejnoty za pomocą pakietu za pośrednictwem Gemfile. Pomyślałem (błędnie), że jeśli usunę klejnot z mojego pliku Gemfile i uruchomię „instalację pakietową”, to usunięte klejnoty zostaną odinstalowane. Przejrzałem plik pomocy pakietu i, o ile wiem, nie ma sposobu na odinstalowanie klejnotów.

Czy po prostu używam gem uninstall x do wszystkiego? Czy to zmyli pakiet?

lashleigh
źródło

Odpowiedzi:

136

Bundler jest uruchamiany z katalogu głównego Twojej aplikacji, więc zapewnia, że ​​wszystkie potrzebne klejnoty są obecne, aby aplikacja działała.Jeśli z jakiegoś powodu nie potrzebujesz już klejnotu, musisz uruchomić

    gem uninstall gem_name 

jak napisałeś powyżej, więc za każdym razem, gdy uruchomisz pakiet, ponownie sprawdzi zależności

EDYCJA - 24.12.2014

Widzę, że ludzie wciąż podchodzą do tego pytania. Postanowiłem coś dodać. Odpowiedź, której udzieliłem, dotyczyła przypadku, gdy utrzymujesz swoje klejnoty na całym świecie. Rozważ użycie menedżera klejnotów, takiego jak rbenv lub rvm, aby zestawy klejnotów były ograniczone do określonych projektów.

Oznacza to, że żadne klejnoty nie zostaną zainstalowane na poziomie globalnym, a zatem po usunięciu jednego z Gemfile projektu i ponownym uruchomieniu pakietu, to oczywiście nie zostanie on załadowany do twojego projektu. Następnie możesz uruchomić pakiet czysty (z katalogiem projektu) i usunie on z systemu wszystkie klejnoty, które były kiedyś instalowane z twojego Gemfile (w tym samym katalogu), ale w tym momencie nie są już tam wymienione .... w skrócie - usuwa nieużywane klejnoty.

Daniel
źródło
98

Spowoduje to odinstalowanie klejnotu zainstalowanego przez pakiet:

bundle exec gem uninstall GEM_NAME

Zauważ, że to rzuca

BŁĄD: Podczas wykonywania gem ... (NoMethodError) undefined method `delete 'for # <Bundler :: SpecSet: 0x00000101142268>

ale klejnot jest faktycznie usunięty. Przy następnym uruchomieniu bundle installklejnot zostanie ponownie zainstalowany.

phatmann
źródło
10
Dla użytkowników RVM: musisz użyć tej metody, jeśli skonfigurowałeś gemset dla swojego konkretnego projektu. Uruchomienie gem uninstall pgz folderu projektu spowoduje odinstalowanie pg z zestawu gemset na poziomie globalnym / systemowym zamiast pakietu
Eric Hu
Czy to jest błąd, o którym mówisz? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833
+1 za zrobienie tego w kontekście pakietu. Żałuję, że nie zgłosił tego błędu! jeszcze lepiej, chciałbym móc dołączyć -f update gemname.
pduey
2
@EricHu nie, jeśli używasz zestawu gemset RVM. za każdym razem, gdy instalujesz klejnot z gem install xxx wewnątrz zestawu klejnotów RVM, jest miejsce, w którym pozostaje, więc wykonanie zwykłego odinstalowania klejnotu xxx na zestawie klejnotów RVM spowoduje usunięcie klejnotu zainstalowanego na tym zestawie, a nie systemowym.
Esteban Feldman,
@EstebanFeldman masz rację, myślę, że była to zmiana w RVM w ciągu ostatnich 11 miesięcy.
Eric Hu
21

W nowszych wersjach bundlera możesz użyć czystego zadania:

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

edytować:

Nie jest to zalecane, jeśli używasz globalnego zestawu klejnotów (tj. - wszystkie twoje projekty trzymają klejnoty w tym samym miejscu). Jest jednak kilka sposobów na oddzielenie klejnotów każdego projektu:

  1. rvmgemsets ( http://rvm.io/gemsets/basics )
  2. bundle installz dowolną z następujących opcji: --deploymentlub --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova
źródło
Używając bundle clean --forceusuniętych perełek, których nie używam w moim obecnym projekcie, ale używam w innych moich projektach. Czy miałem wytyczyć ścieżkę? bundle cleanZwraca po prostu „Można użyć czyszczenia pakunku tylko wtedy, gdy ustawiono opcję --path lub --force”. Ale --pathopcja nie pojawia się nawet w pomocy.
Dennis
1
Zgadza się @Dennis. To cleanzadanie nie ma sensu, jeśli używasz globalnego zestawu klejnotów. Ale jeśli chcesz, każdy z twoich projektów może mieć osobne klejnoty. Możesz to zrobić za pomocą rvm gemsets ( rvm.io/gemsets/basics ) lub określając ścieżkę klejnotów za pomocą --pathopcji bundle install( bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova
1

Aby odinstalować klejnot, musisz użyć opcji „odinstalowanie klejnotu nazwa_gmusa”.

Zwróć uwagę, że jeśli zainstalowałeś gem w całym systemie (np. Instalacja pakietu sudo), może być konieczne określenie katalogu binarnego za pomocą opcji -n, aby mieć pewność, że pliki binarne należące do gem zostaną usunięte. Na przykład

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin
Declan McGrath
źródło
1

Wydawało się, że rozwiązałem ten problem, ręcznie usuwając klejnot jednorożca za pośrednictwem pakietu („sudo bundler exec gem uninstall unicorn”), a następnie ponownie zbierając („sudo bundle install”).

Nie jestem pewien, dlaczego tak się stało, chociaż powyższa poprawka wydaje się działać.

Aaron Marks
źródło
1

Jeśli chcesz oczyścić wszystkie swoje klejnoty i zacząć od nowa

sudo gem clean
Douglas G. Allen
źródło