如何删除默认宝石? !想卸载一个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的主要内容,如果未能解决你的问题,请参考以下文章

基准宝石改进

如何在RubyMine中打开宝石进行编辑?

网易官方极客战记(codecombat)攻略-森林-宝石或者死亡gems-or-death

Gemfile 中的宝石顺序有影响吗?

Rails 5 - 如何删除 twitter-bootstrap-rails gem 并手动安装

如何使用地理编码宝石获得时区?