如何删除默认宝石? !想卸载一个gem 1.7.7版本的json
Posted
技术标签:
【中文标题】如何删除默认宝石? !想卸载一个gem 1.7.7版本的json【英文标题】:How can I remove a default gem? ! want to uninstall a gem 1.7.7 version of json 【发布时间】:2014-01-06 07:31:10 【问题描述】:我在 OSX 和 Ubuntu 中有相同的 rails 应用程序,我想使用 Zeus 来加速我的 rspec。
在 Ubuntu 中,Zeus 启动正常,但在 OSX 中它总是崩溃。
最后我找到了问题,https://github.com/burke/zeus/issues/237#issuecomment-18700462 OSX 和 Ubuntu 的区别在于 json gem 的版本。
我用gem list | grep json
Ubuntu 显示
json (1.8.1, 1.8.0, 1.5.3)
json_pure (1.5.3)
json_spec (1.1.1)
jsonpath (0.5.3)
multi_json (1.8.2, 1.7.8, 1.0.3)
Mac 显示
json (1.8.1, 1.7.7)
json_spec (1.1.1)
jsonpath (0.5.5, 0.5.3)
multi_json (1.8.2, 1.7.8)
所以想卸载1.7.7版本的json gem让zeus启动,但是
gem uninstall json -v 1.7.7
ERROR: While executing gem ... (Gem::InstallError)
gem "json" cannot be uninstalled because it is a default gem
我该怎么办?
【问题讨论】:
Uninstalling all gems Ruby 2.0.0的可能重复 删除默认 gem 是很危险的,而不是使用 rbenv/rvm 创建其他 gem 环境,并在 gemset 内部用较新的版本替换 gem。 @JavierCadiz 谢谢,我终于在这里找到了解决方案uninstalling-all-gems-ruby-2-0-0 老实说,并不是每个环境都使用 ram 或版本管理器。我们运行大约 20 个服务,每个服务都在其自己的 docker 容器和该容器中。因为它只运行 1 个服务或应用程序,只需要在系统 gem 中有确切的 gem。这当然使 OOP 问题有效。 【参考方案1】:因此,据我所知,没有简单的命令可以将 gemspec 文件从默认文件夹移动到非默认文件夹。据我所知,这是一件好事,但这里有关于如何手动执行此操作的说明。
找到默认规范的位置。最简单的方法是进入irb
并运行以下命令:
irb(main):002:0> Gem.default_specifications_dir
=> "/Users/user/.rubies/ruby-2.5.7/lib/ruby/gems/2.5.0/specifications/default"
对于较旧的红宝石,它是:
irb(main):001:0> File.join Gem::Specification.default_specifications_dir
=> "/Users/newdark/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/specifications/default"
这是构建 gemspec 路径的代码行 https://github.com/rubygems/rubygems/blob/v2.6.13/lib/rubygems/installer.rb#L420
获得文件路径后,您只需将 gem 名称和版本从默认文件夹移动到父文件夹即可。
$ cd /Users/newdark/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/specifications/default
$ mv json-1.7.7.gemspec ../
如果您使用 gem list -d
,您应该不会再看到 gem 版本 json-1.7.7 旁边的 Installed at (default)
字样。然后你可以运行gem uninstall json -v 1.7.7
而不会与你发生冲突。如果你想撤消这一切,只需运行gem install json -v 1.7.7 --default
【讨论】:
此外,sudo rm -rf /Library/Ruby/Gems/2.6.0/json-1.7.7
在安装更新版本之前可能是必需的。【参考方案2】:
我在使用 gems 的默认版本时遇到了问题,接受的答案对我不起作用。对我有用的是安装与默认版本相同的版本,但没有默认标志,然后将其卸载。
gem install json -v '1.7.7'
然后一旦完成:
gem uninstall json -v '1.7.7'
【讨论】:
这似乎不太可能在大多数情况下工作,因为<ruby_install_dir>/lib/ruby/gems/<ruby_major_ver>/specifications/default
现在将拥有.gemspec
的副本,父目录也将如此。尝试此解决方案后,我仍然必须从我的 specifications/default
目录中删除(现在重复的)json-x.y.z.gemspec
文件。
它实际上没有用。您收到一条消息,告诉您卸载命令成功,但实际的卸载操作没有,因为 gem 是默认的。请仔细看看。
这对我有用【参考方案3】:
也许这会对你有所帮助....
bundle exec gem uninstall GEM_NAME
如果上面的 cmd 不起作用,那么试试这个
在 irb 或适当的脚本中执行:
`gem list --no-versions`.split("\n").each do |gem|
`gem list -d #gem`.gsub(/Installed at(.*):.*/).each do |dir|
dir = dir.gsub(/Installed at(.*): /,'').gsub("\n", '')
system "gem uninstall #gem -aIx -i #dir"
end
end
如果以上两个都失败了,那么试试这个
转到您的 rvm 目录.. 安装所有 gem,然后手动删除您想要的 gem.. 例如在我的情况下,我的 gem 目录位置是 /home/user_name/.rvm/gems/ruby-1.9.3 -p194/宝石
【讨论】:
嗨哈斯哈尔,我照你说的做了,但它显示ERROR: Gem names and --all may not be used together
,宙斯仍然无法运行。
然后转到您的 rvm 目录 .. 安装所有 gem 的位置,然后手动删除您想要的 gem .. 例如在我的情况下,我的 gem 目录位置是 /home/user_name/.rvm/gems /ruby-1.9.3-p194/gems以上是关于如何删除默认宝石? !想卸载一个gem 1.7.7版本的json的主要内容,如果未能解决你的问题,请参考以下文章
网易官方极客战记(codecombat)攻略-森林-宝石或者死亡gems-or-death