Quelle est la meilleure façon de désinstaller des gemmes d'un projet rails3?

102

J'ai installé tous mes gemmes en utilisant le bundler via le Gemfile. Je pensais (à tort) que si je supprimais un joyau de mon Gemfile et exécutais 'bundle install', les gemmes supprimées seraient désinstallées. J'ai regardé le fichier d'aide du bundler et, pour autant que je sache, il n'a pas de moyen de désinstaller les gemmes.

Dois-je simplement utiliser gem uninstall x pour tout? Cela va-t-il confondre bundler?

lashleigh
la source

Réponses:

136

Le bundler est lancé à partir du répertoire racine de votre application afin de s'assurer que toutes les gemmes nécessaires sont présentes pour que votre application fonctionne.Si pour une raison quelconque vous n'avez plus besoin d'un gem, vous devrez exécuter le

    gem uninstall gem_name 

comme vous l'avez indiqué ci-dessus.

EDIT - 24.12.2014

Je vois que les gens continuent à venir à cette question, j'ai décidé d'ajouter un petit quelque chose. La réponse que j'ai donnée était pour le cas où vous maintenez vos gemmes dans le monde entier. Pensez à utiliser un gestionnaire de gemmes tel que rbenv ou rvm pour garder les ensembles de gemmes adaptés à des projets spécifiques.

Cela signifie qu'aucune gemme ne sera installée au niveau global et donc, lorsque vous en supprimez une du fichier Gemfile de votre projet et que vous réexécutez le bundle, il ne sera évidemment pas chargé dans votre projet. Ensuite, vous pouvez exécuter bundle clean (avec le répertoire du projet) et il supprimera du système toutes les gemmes qui étaient une fois installées de votre Gemfile (dans le même répertoire) mais à ce moment-là ne sont plus répertoriées là ... histoire courte - il supprime les gemmes inutilisées.

Daniel
la source
98

Cela désinstallera un gem installé par le bundler:

bundle exec gem uninstall GEM_NAME

Notez que cela jette

ERREUR: lors de l'exécution de gem ... (NoMethodError) méthode non définie `delete 'pour # <Bundler :: SpecSet: 0x00000101142268>

mais la gemme est effectivement supprimée. La prochaine fois que vous exécuterez bundle installle gem sera réinstallé.

Phatmann
la source
10
Pour les utilisateurs RVM: vous devez utiliser cette méthode si vous avez configuré un ensemble de gemmes pour votre projet particulier. L'exécution à gem uninstall pgpartir du dossier du projet désinstallera pg de votre ensemble de gemmes global / système au lieu de celui du bundler
Eric Hu
Est-ce l'erreur dont vous parlez? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833
+1 pour le faire dans un contexte de bundle. souhaite qu'il ne jette pas cette erreur! mieux encore, j'aimerais pouvoir regrouper -f update gemname.
pduey
2
@EricHu pas si vous utilisez le jeu de gemmes RVM. chaque fois que vous installez un gem avec gem install xxx dans un jeu de gemmes RVM, c'est là qu'il reste, donc faire une simple désinstallation de gemme xxx sur un jeu de gemmes RVM supprimera le gem installé sur ce jeu de gemmes et non celui du système.
Esteban Feldman
@EstebanFeldman vous avez raison, je pense que c'est un changement apporté à RVM au cours des 11 derniers mois.
Eric Hu
21

Avec les nouvelles versions de bundler, vous pouvez utiliser la tâche de nettoyage:

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

Éditer:

Ce n'est pas recommandé si vous utilisez un ensemble de gemmes global (c'est-à-dire que tous vos projets gardent leurs gemmes au même endroit). Il existe cependant quelques moyens de séparer les joyaux de chaque projet:

  1. rvmjeux de gemmes ( http://rvm.io/gemsets/basics )
  2. bundle installavec l'une des options suivantes: --deploymentou --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova
la source
L'utilisation a bundle clean --forcesupprimé un tas de gemmes que je n'utilise pas dans mon projet actuel mais que j'utilise dans mes autres projets. Étais-je censé tracer une voie? bundle cleanRenvoie simplement "Ne peut utiliser le nettoyage de bundle que lorsque --path est défini ou --force est défini". Mais l' --pathoption n'apparaît même pas dans l'aide.
Dennis
1
C'est correct @Dennis. La cleantâche n'a pas vraiment de sens si vous utilisez un ensemble de gemmes global. Mais si vous le souhaitez, chacun de vos projets peut avoir ses joyaux séparés. Vous pouvez le faire soit via rvm gemsets ( rvm.io/gemsets/basics ), soit en spécifiant le chemin des gemmes via l' --pathoption bundle install( bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova
1

Vous devez utiliser 'gem uninstall gem_name' pour désinstaller un gem.

Notez que si vous avez installé le gem à l'échelle du système (c.-à-d. Sudo bundle install), vous devrez peut-être spécifier le répertoire binaire en utilisant l'option -n, pour vous assurer que les binaires appartenant au gem sont supprimés. Par exemple

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

J'ai semblé résoudre ce problème en supprimant manuellement la gemme licorne via le bundler ("sudo bundler exec gem uninstall unicorn"), puis en le rebundling ("sudo bundle install").

Je ne sais pas pourquoi cela s'est produit, bien que le correctif ci-dessus semble fonctionner.

Marques d'Aaron
la source
1

Si vous voulez nettoyer toutes vos gemmes et recommencer

sudo gem clean
Douglas G. Allen
la source