如何获取已安装具有本机扩展名的gem列表?

时间:2011-03-02 10:11:24

标签: ruby rubygems gem

我在Windows上,并且已经从ruby 1.8.x更新到1.9.x,现在我收到错误弹出窗口,抱怨ruby-mssomethingrt.1.8.x.dll丢失。

我想知道哪些gems具有原生扩展,因此我可以卸载它们并在安装期间在本地强制重建本机扩展,以使错误消失。

5 个答案:

答案 0 :(得分:7)

一个好的开始是查看每个gem的gem规范,看看它是否设置了extensions字段。这应该给你留下一个重新安装宝石的简短列表。它们不一定都使用原生扩展,但如果你查看相应的extconf.rb文件,这应该很容易找到。

更新:这是一个简短的ruby脚本列出这些宝石:

require 'rubygems'

Gem.source_index.each do |gem|
  spec =  Gem.source_index.specification(gem[0])
  ext = spec.extensions
  puts "#{gem[0]} has extensions: #{ext}" unless ext.empty?
end

答案 1 :(得分:5)

您可以使用以下命令重建(并恢复到原始状态)所有已安装的宝石:

gem pristine --all

--all --no-extensions将恢复没有扩展名的gems ,但是尽管有文档记录,--extensions似乎没有效果(至少在Ubuntu 12.10上的rubygems 1.8.23上)。< / p>

答案 2 :(得分:4)

基于this answer,这是一个解决方案,可以找到并提供重新安装带有原始扩展名的宝石,该扩展程序适用于最近的红宝石(&gt; = 1.9)

native_gems = []
Gem::Specification.each do |spec|
  native_gems << "#{spec.name}:#{spec.version}" unless spec.extensions.empty?
end

install_cmd = "gem install #{native_gems.join ' '}"
puts "Found #{native_gems.length} gem(s) with native extensions:"
puts "\n> " + install_cmd, "\nReinstall gems with above command? (yn)"

exec insall_cmd if gets.downcase[0] == 'y'

示例输出:

Found 36 gem(s) with native extensions:

> gem install atomic:1.1.13 bcrypt-ruby:3.0.1 bigdecimal:1.2.0 eventmachine:1.0.3 eventmachine:1.0.0 eventmachine:0.12.10 ffi:1.9.3 ffi:1.9.0 ffi:1.7.0 hiredis:0.4.5 hpricot:0.8.6 io-console:0.4.2 json:1.8.1 json:1.8.0 json:1.7.6 nokogiri:1.6.0 nokogiri:1.5.9 pg:0.17.1 pg:0.17.0 pg:0.16.0 pg:0.15.1 pg:0.13.2 psych:2.0.0 puma:2.7.1 puma:2.6.0 puma:2.4.0 puma:1.6.3 sqlite3:1.3.8 sqlite3:1.3.7 sqlite3:1.3.5 therubyracer:0.12.0 thin:1.5.1 thin:1.5.0 thin:1.4.1 websocket-driver:0.2.3 websocket-driver:0.1.0

Reinstall gems with above command? (yn)
…

答案 3 :(得分:0)

宝石清单

gem旁边的版本之后的部分应该指示它是否正在运行本机代码: 例如json(1.4.6 x86-mingw32)

您看到的错误是因为您使用的某个宝石需要1.8 ruby​​解释器,而不再存在(因为您已升级到1.9)。

我原以为只运行'gem update'就可以解决你的问题。如果没有,那么你可能需要为期望ruby 1.8解释器存在的那个寻找另一个gem。

答案 4 :(得分:0)

在Cygwin中,您可以尝试gem list --all -d | grep --before-context=1 --after-context=4 Platform