Ruby on rails 如何卸载使用“bundle install”安装的所有gems`
如何删除在特定RoR项目中使用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/
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