我如何移除在某个RoR项目中使用bundle install
安装的所有gem。我不想卸载其他项目使用的gem。
我如何移除在某个RoR项目中使用bundle install
安装的所有gem。我不想卸载其他项目使用的gem。
因为我们正在使用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(/\(|\)/, "")}`; }'
注意:仅进行了轻微测试。
--force
后对我有用。 - Gerrygem install bundler
,然后bundle install
。 - Ralphrvm gemset empty
更加高效和干净。 - psychoslave请将Gemfile中所有的gem注释掉并运行
bundle clean --force
没有一种简单的方法可以移除所有的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
调用都将使用它,除非您将其设置为其他内容或从配置中删除它!
如果你正在使用RVM,你可以像Tobias所说的那样使用以下命令:
rvm gemset empty [gemset]
直接作用于要清空的gemset,例如:
rvm gemset empty 2.0.0@server
其实这很简单
gem list --no-versions | xargs gem uninstall -a
如果您没有使用RVM/RBENV,当gem尝试卸载系统库时可能会遇到问题,这可能会导致失败。在这种情况下,请逐个调用卸载命令以跳过这些库。gem list --no-versions | xargs -n1 gem uninstall -a
% 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 环境。
以下是一些与 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
列出所有的 gemcut -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 包。bundle clean --force
这将移除由 bundler
安装的所有 gem。
然后,您可以使用备份副本或 git
恢复 Gemfile
和 Gemfile.lock
。
我找到了卸载除默认以外所有宝石的解决方案:
创建 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