卸载所有Ruby 2.0.0的gem

47
似乎 Ruby 2.0.0 添加了“默认” gem,并使它们无法通过 gem uninstall 卸载。如何删除所有非默认 gem?

你能提供一些 gem 的例子以及你是如何安装 Ruby 2.0 的(手动安装?使用 rvm?) - Marc-André Lafortune
1
我使用rbenv安装了ruby 2.0.0-p0。对于我来说,“默认”的gems包括:bigdecimal 1.2.0,io-console 0.4.2,json 1.7.7,minitest 4.3.2,psych 2.0.0,rake 0.9.6,rdoc 4.0.0,test-unit 2.0.0.0。gem uninstall json会出现错误,提示无法卸载gem“json”,因为它是默认的gem。 - Nathan Lilienthal
1
抱歉,我误解了。我从来没有删除过宝石,也不确定为什么要这样做。你为什么需要除了 gem cleanup 之外的其他东西呢? - Marc-André Lafortune
2
有时候我只想摆脱一些东西。清理可能是大多数人大部分时间所需要的。然而,有时我想要摆脱所有的宝石来测试需要安装像宝石这样的东西的bash脚本。 - Nathan Lilienthal
rvm 有 gemsets,不确定 rbenv 是否有。 - Marc-André Lafortune
我目前正在使用一个没有rvmrbenv的Ruby系统。但是如果我有rvm,那么简单的rvm gemset empty就可以了 :) - Nathan Lilienthal
4个回答

87

我使用了这个一行脚本。

for i in `gem list --no-versions`; do gem uninstall -aIx $i; done

它会忽略默认的宝石错误并继续运行。简单而明显。

这是一个更简单的解决方案,假设rubygems继续以这种方式工作 :) - Nathan Lilienthal
干得好!你不经常看到使用循环发布的简洁shell命令。 - james_womack
21
无法正常工作,仍然会收到“由于它是默认的 gem 而无法卸载”的错误提示。 - Nippysaurus
1
@Nippysaurus 这是正常的。你可以忽略它。如果你的意思是命令在第一个错误后停止,那么输入 set +e 再试一次。 - ihji
@ihji会知道这个命令是否有效gem list --no-version | awk 'NR>1{ print $(NF-1) }' | xargs gem 2>/dev/null uninstall -aIx它没有报错,但也没有卸载gems。我猜想当错误发生时(即使被重定向),命令仍然停止执行。 - Integralist
如果使用zsh,您可以更短(仅限于cli,不作为脚本):for i in $(gem list --no-versions); gem uninstall -aIx $i - Pablo Olmos de Aguilera C.

13

首先,转到宝石(gems)目录,例如../ruby/2.0.0-p195/lib/ruby/gems/2.0.0/specifications
您会发现一个名为default的目录,其中包含了ruby 2.0附带的所有默认宝石(gems)

移动存储在default目录中的*.gemspecspecifications目录,并删除空的default目录。

然后您可以像以前一样随心所欲地进行操作。:-)


规范目录现在用于什么?我猜它在加载路径中? - Nathan Lilienthal
这对我有用。 其他SO问题、github甚至ruby gem文档中的“解决方案”都没有起作用。 - devs1993

6
我用Ruby编写了一个脚本,用于删除所有非默认的宝石。

https://gist.github.com/nixpulvis/5042764

现在需要这样做是因为与2.0.0之前不同,一些gem会在安装ruby时被标记为“默认”,不能使用gem uninstall来卸载。这使得以前流行的删除所有gems的方法不再起作用。

供参考,以下是代码:
gem list | cut -d" " -f1 | xargs gem uninstall


提供的链接已不存在。"OH NOES,404"。这个脚本还存在其他地方吗?还是“参考”行就是整个脚本? - Br.Bill
1
谢谢。我已经更改了我的用户名。URL已经固定。 - Nathan Lilienthal
1
这会导致默认宝石崩溃。 - brauliobo
这对于某个特定 gem 存在多个版本的情况不起作用。 - veer7

0

我还没有找到比排除“默认”宝石更好的答案:

/usr/local/bin/gem list --no-versions | \
grep -v -E "(bigdecimal|io-console|json|minitest|psych|rake|rdoc|test-unit)" | \
xargs --no-run-if-empty /usr/local/bin/gem uninstall --executables --user-install --all --force

这段代码假设你已经在Linux上从源代码安装了Ruby 2.0。 - Kevin

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