web-dev-qa-db-fra.com

Comment désinstaller tous les gems installés en utilisant `bundle install`

Comment puis-je supprimer toutes les gemmes installées à l'aide de bundle install dans un projet RoR particulier? Je ne veux pas désinstaller les gemmes utilisées par d'autres projets.

38
nish

Puisque nous utilisons Ruby, vous pouvez faire quelque chose comme ceci, je suppose:

bundle list | Ruby -e 'ARGF.readlines[1..-1].each {|l| g = l.split(" ");  puts "Removing #{g[1]}"; `gem uninstall --force #{g[1]} -v #{g[2].gsub(/\(|\)/, "")}`; }'

REMARQUE: seulement légèrement testé.

26
rainkinz

Il n’existe pas de moyen simple de supprimer toutes les gemmes - encore moins de les supprimer d’un paquet spécifique. Vous pouvez essayer certaines de ces suggestions: Désinstaller toutes les gems installées, sous OSX?

Adapter à la commande bundle show au lieu de gem list


Pour l'avenir, essayez cette approche:

Si vous installez votre paquet localement, comme dans l'exemple ci-dessous, les gems ne seront pas installés dans votre répertoire gem global. Ensuite, vous pouvez facilement supprimer le dossier d'installation pour supprimer toutes les gemmes de l'ensemble.

# install gems to project_root/vendor/bundle
bundle install --path vendor/bundle --without test

L'option de chemin d'accès est enregistrée dans .bundle/config comme tous les autres. Tous les appels bundle install suivants l'utiliseront, sauf si vous le définissez autrement ou si vous le supprimez de la configuration!

11
KappaNossi

Vous pouvez utiliser (comme dit Tobias, si vous utilisez RVM)

rvm gemset empty [gemset]

Directement sur le gemset, par exemple

rvm gemset empty 2.0.0@server
9
martincito

Si vous utilisez rvm, vous pouvez bien sûr désinstaller et réinstaller la version de Ruby sous laquelle vous avez installé les gems, c.-à-d.

% rvm use
Using /home/ubuntu/.rvm/gems/Ruby-2.2.1
% rvm uninstall 2.2.1
Ruby-2.2.1 - #removing rubies/Ruby-2.2.1..
Ruby-2.2.1 - #removing default Ruby interpreter.............
% rvm install 2.2.1
Searching for binary rubies, this might take some time.
Found remote file https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/14.0/x86_64/Ruby-2.2.1.tar.bz2
Checking requirements for ubuntu.
Requirements installation successful.
Ruby-2.2.1 - #configure
Ruby-2.2.1 - #download
Ruby-2.2.1 - #validate archive
Ruby-2.2.1 - #setup 
Ruby-2.2.1 - #gemset created /home/ubuntu/.rvm/gems/Ruby-2.2.1@global
Ruby-2.2.1 - #importing gemset /home/ubuntu/.rvm/gemsets/global.gems..............................
Ruby-2.2.1 - #generating global wrappers........
Ruby-2.2.1 - #gemset created /home/ubuntu/.rvm/gems/Ruby-2.2.1
Ruby-2.2.1 - #importing gemsetfile /home/ubuntu/.rvm/gemsets/default.gems evaluated to empty gem list
Ruby-2.2.1 - #generating default wrappers........

et maintenant vous avez un environnement Ruby propre de toutes les gemmes installées.

3
Dan Kerchner

C'est aussi simple que

gem list --no-versions | xargs gem uninstall -a

Si vous n'utilisez pas RVM/RBENV, vous pouvez tomber dans le problème lorsque gem tente de désinstaller la bibliothèque système, ce qui peut échouer. Dans ce cas, appelez la commande de désinstallation une par une pour les ignorer.

gem list --no-versions | xargs -n1 gem uninstall -a
3
lzap

Une autre façon de https://makandracards.com/jan0sch/9537-uninstall-all-Ruby-gems-from-your-system (similaire à réponse de rainkinz et commentaire de Ralph ). Voici quelques variations:

# if you're the root user:
gem list | cut -d" " -f1 | xargs -I % gem uninstall -aIx %

# if you're a non-root user:
gem list | cut -d" " -f1 | xargs -I % Sudo gem uninstall -aIx %

# docker compose (if your service is named "web" running the root user):
docker-compose run web bash -c 'gem list | cut -d" " -f1 | xargs -I % gem uninstall -aIx %'

####

gem install bundler
# or if using docker compose:
docker-compose run web gem install bundler

# optionally reinstall gems:
bundle install
# or if using docker compose:
docker-compose run web bundle install

En décomposant ceci:

  • gem list liste toutes les gemmes
  • cut -d" " -f1 prend la première colonne
  • xargs -I % gem uninstall -aIx % appelle gem uninstall -aIx avec chaque ligne de sortie comme argument

Notez que j'ai spécifié l'argument avec -I en tant que % et que je l'ai passé directement pour la sécurité:

xargs -I % gem uninstall -aIx %

au lieu de:

xargs gem uninstall -aIx

En effet, xargs a un problème de sécurité dans lequel des options telles que -n peuvent être transmises à sa commande et provoquer des résultats inattendus. Cela peut être démontré avec l'exemple suivant:

# correctly prints "-n hello" (with trailing newline):
echo '-n Hello' | xargs -I % echo % | xargs -I % echo %

# incorrectly prints "hello" (without trailing newline):
echo '-n Hello' | xargs echo
0
Zack Morris

Solution trouvée pour désinstaller toutes les gemmes sauf la valeur par défaut:

Crete delete_gems.rb avec

#!/usr/bin/env Ruby
# Remove all gems EXCEPT defaults :)

`gem list -d`.split(/\n\n^(?=\w)/).each do |data|
  match = data.match(/(?<name>([^\s]+)) \((?<versions>.*)\)/)
  name = match[:name]
  versions = match[:versions].split(', ')

  if match = data.match(/^.*\(([\d\.]*),? ?default\): .*$/)
    next if match[1].empty? # it's the only version if this match is empty
    versions.delete(match[1] || versions[0])
  end

  versions.each { |v| system "gem uninstall -Ix #{name} -v #{v}" }
end

Exécutez ce script:

Sudo chmod 1777 delete_gems.rb
./delete_gems.rb

Toutes les pierres précieuses seront supprimées, à l'exception du fichier par défaut . Ici le lien sur la solution d'origine http://zanshin.net/2013/06/10/how-to-delete-all-Ruby-gems/

0
Kirikami