如何卸载所有使用`bundle install`安装的gem?

70

我如何移除在某个RoR项目中使用bundle install安装的所有gem。我不想卸载其他项目使用的gem。


12个回答

39

因为我们正在使用Ruby,所以我想你可以像这样做:

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(/\(|\)/, "")}`; }'

注意:仅进行了轻微测试。


尝试过这个,但不起作用。我的建议是bundle list输出不是特定gems的干净列表:bundle list中的gems不包括版本,有项目符号和另一个标题字符串,可能会妨碍操作。这是我的意见。 - j4v1
1
删除 --force 后对我有用。 - Gerry
1
对于我在OSX上的情况,使用上述命令,只需将第一个命令中的“list”替换为“show”。等等,我不确定它是否只卸载了这个特定Gemfile中的gems。看起来是这样的:http://bundler.io/v1.11/bundle_show.html - MikeiLL
1
对我有用。请注意,它还会删除bundler,因此您需要gem install bundler,然后bundle install - Ralph
1
在 Fedora 31 上工作良好,但是 @martincito 的答案使用 rvm gemset empty 更加高效和干净。 - psychoslave

28

请将Gemfile中所有的gem注释掉并运行

bundle clean --force

不是OP要求的。 - DustWolf

17

没有一种简单的方法可以移除所有的gems,更别提移除一个特定bundle中的gems了。你可以尝试以下建议:

在OSX中卸载已安装的所有gems?

改用bundle show命令而非gem list


对于未来,请尝试以下方法:

如果你像下面的示例一样在本地安装你的bundle,那么这些gems将不会被安装在全局gem目录中。然后,您可以轻松删除安装文件夹以删除bundle中的所有gems。

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

路径选项会像其他所有选项一样保存在.bundle/config文件中,任何后续的bundle install调用都将使用它,除非您将其设置为其他内容或从配置中删除它!


3
+1 我总是将它们安装在供应商目录下。这样更容易管理和保持系统的清洁。 - andHapp
@KappaNossi:如果我删除这个文件夹,那么对应 bundle 中已安装的 gem 占用的内存会被释放吗? - nish
当然可以。唯一的缺点是,如果多个项目使用相同的 gem,则会在相应的 vendor 文件夹中安装多个副本,而不是在全局 gem 列表中使用一个中央 gem。 - KappaNossi

15

如果你正在使用RVM,你可以像Tobias所说的那样使用以下命令:

rvm gemset empty [gemset]

直接作用于要清空的gemset,例如:

rvm gemset empty 2.0.0@server

13

其实这很简单

gem list --no-versions | xargs gem uninstall -a
如果您没有使用RVM/RBENV,当gem尝试卸载系统库时可能会遇到问题,这可能会导致失败。在这种情况下,请逐个调用卸载命令以跳过这些库。
gem list --no-versions | xargs -n1 gem uninstall -a

喜欢这个解决方案。简单、干净,比删除 Ruby 版本并重新安装要快。 - Dave Kapp

5
如果您使用的是 rvm,您当然可以卸载并重新安装您安装了 gems 的 ruby 版本,例如:
% 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........

现在,您已经拥有一个没有任何已安装宝石的 Ruby 环境。


4

以下是一些与 https://makandracards.com/jan0sch/9537-uninstall-all-ruby-gems-from-your-system(类似于rainkinz的回答Ralph的评论)不同的方法。这里有一些变化:

# 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

将其分解:

  • gem list 列出所有的 gem
  • cut -d" " -f1 取第一列
  • xargs -I % gem uninstall -aIx % 使用每个输出行作为参数调用 gem uninstall -aIx

请注意,我使用 -I 指定了参数为 % 并直接传递以确保安全性:

xargs -I % gem uninstall -aIx %

替代:

xargs gem uninstall -aIx

这是因为 xargs 存在一个安全问题,例如 -n 这样的选项可能会被传递到其命令中并导致意外结果。以下示例可证明此问题:
# 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

3

如果你的问题和我类似,那么你需要卸载所有在测试 GemFile 更改时安装的 gem 包。在这种情况下,我只是使用了以下命令:

bundle clean

这将卸载掉所有未在 GemFileGemFile.lock 中指定的 gem 包。我没有测试过,但是我想你可以删除 Gemfile 中的所有行,并运行上述命令来摆脱当前目录中由 ROR 项目安装的所有 gem 包。

2
我正在使用docker设置,以下是我如何在不重建docker的情况下恢复由bundler安装的gem。
备份Gemfile和Gemfile.lock文件。
暂时删除您的Gemfile文件内容(不要删除文件,只需将其留空),然后(可选)删除Gemfile.lock文件并运行:
bundle clean --force

这将移除由 bundler 安装的所有 gem。

然后,您可以使用备份副本或 git 恢复 GemfileGemfile.lock


1

我找到了卸载除默认以外所有宝石的解决方案:

创建 delete_gems.rb 文件:

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

运行此脚本:

sudo chmod 1777 delete_gems.rb
./delete_gems.rb

除了默认的宝石,所有其他宝石都将被删除。 这是原始解决方案的链接: http://zanshin.net/2013/06/10/how-to-delete-all-ruby-gems/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接