Ruby on rails 如何卸载使用“bundle install”安装的所有gems`

Ruby on rails 如何卸载使用“bundle install”安装的所有gems`,ruby-on-rails,bundler,Ruby On Rails,Bundler,如何删除在特定RoR项目中使用bundle install安装的所有gem。我不想卸载其他项目使用的gem。没有一种简单的方法可以删除所有gem,更不用说删除特定包中的gem了。您可以尝试以下建议: 适应bundle show命令,而不是gem list 对于未来,请尝试以下方法: 如果您像下面的示例一样在本地安装包,gems将不会安装在您的全局gem目录中。然后,您可以轻松删除安装文件夹以删除捆绑包中的所有gem # install gems to project_root/vendor/

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

没有一种简单的方法可以删除所有gem,更不用说删除特定包中的gem了。您可以尝试以下建议:

适应
bundle show
命令,而不是
gem list


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

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

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

path选项与所有其他选项一样保存到.bundle/config,除非您将其设置为其他选项或从配置中删除,否则任何后续的
bundle安装
调用都将使用它

既然我们使用的是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(/\(|\)/, "")}`; }'

注意:仅进行了少量测试。

如果您使用的是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........
现在,您有了一个没有任何已安装gems的ruby环境。

您可以使用(如Tobias所说,如果您使用的是RVM)

rvm gemset empty[gemset]

例如,直接在gemset上

rvm gemset empty 2.0.0@server

找到了卸载所有gem(默认除外)的解决方案:

克里特岛删除_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
除默认值外,所有宝石都将被删除。 这里是原始解决方案的链接

事实上,它很简单

gem list --no-versions | xargs gem uninstall -a
若您并没有使用RVM/RBENV,那个么当gem试图卸载系统库时,您可能会遇到问题,这可能会失败。在这种情况下,逐个调用uninstall命令跳过这些操作

gem list --no-versions | xargs -n1 gem uninstall -a
来自的另一种方式(类似于和)。以下是一些变体:

# 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
分解如下:

  • 宝石列表
    列出所有宝石
  • 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

如果您的问题与我的问题类似,那么您希望卸载在测试
GemFile
更改时安装的所有gem,在这种情况下,我只使用了:

bundle clean
卸载了未在
GemFile
GemFile.lock
中指定的所有gem


我还没有测试过它,但我想您可以删除Gemfile中的所有行,然后运行上面的命令来删除ROR项目在当前目录中安装的所有gem。

注释掉Gemfile中的所有gem,然后运行

bundle clean——强制

正如其他人提到的,您可以使用rvm。列出所有可用的宝石

rvm gemset list
然后

rvm gemset empty <gemset-name>
rvm gemset为空

我使用的是
docker
设置,以下是我如何在不重建
docker
的情况下还原由
bundler
安装的gems


拥有
Gemfile
Gemfile.lock
的备份副本

暂时删除您的
Gemfile
不要删除该文件,只需将其保留为空即可)然后(可选)删除
Gemfile。锁定
并运行:

bundle clean --force
这将删除捆绑机安装的所有gem


然后,您可以还原
Gemfile
Gemfile。使用备份副本或
git

锁定它们,请参见:+1我始终在供应商中安装它们。管理和保持系统干净更容易。@KappaNossi:如果我删除文件夹。这会释放相应捆绑包中安装的gems所占用的内存吗?当然会。缺点是,如果多个项目使用同一个gem,您将在相应的供应商文件夹中安装多个gem,而不是在全局gem列表中使用一个中心gem。尝试了此方法,但无效。我的提示是,bundle列表输出并不是一个特定gem的干净列表:bundle列表中的gem不包括版本,可能有项目符号和另一个标题字符串。在OSX上为我删除
--force
后,我的2美分为我工作,但将第一个命令中的
list
替换为
show
-等等-我不完全确定它是否只是从这个特定的gem文件中卸载了gems。看起来是这样的:为我工作。注意,它还删除了bundler,因此您需要
gem安装bundler
然后
bundle安装
。这是在Fedora 31上完成的,但是使用
rvm gemeset empty
的@martincito anwer更高效、更干净。喜欢这个解决方案。简单、干净,比删除Ruby版本并重新安装它们更快。
bundle clean --force