How do I get a list of gems that are installed that have native extensions?

后端 未结 5 916
梦谈多话
梦谈多话 2021-01-01 21:05

I\'m on windows, and have updated from ruby 1.8.x to 1.9.x, and am now getting error popups that complain ruby-mssomethingrt.1.8.x.dll is missing.

I would like to fi

相关标签:
5条回答
  • 2021-01-01 21:31

    In Cygwin you could try gem list --all -d | grep --before-context=1 --after-context=4 Platform.

    0 讨论(0)
  • 2021-01-01 21:32

    A good start would be to look at the gem specification for each gem and see if it has the extensions field set. That should leave you with a short-list of gems to re-install. They don't necessarily all use native extensions, but if you look at the corresponding extconf.rb files, this should be pretty easy to find out.

    Update: Here is a short ruby script to list those gems:

    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
    
    0 讨论(0)
  • 2021-01-01 21:37

    You can rebuild (and restore to a pristine state) all installed gems with:

    gem pristine --all
    

    --all --no-extensions will restore gems without extensions, but despite being documented, --extensions appears to have no effect (at least on rubygems 1.8.23 on Ubuntu 12.10).

    0 讨论(0)
  • 2021-01-01 21:45

    Based on this answer, here is a solution that finds and offers to reinstall gems with native extensions that works with recent rubies (>=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'
    

    Example Output:

    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)
    …
    
    0 讨论(0)
  • 2021-01-01 21:56

    gem list

    the part after the version next to the gem should indicate whether it's running native code: e.g. json (1.4.6 x86-mingw32)

    The error you are seeing is because one of the gems you are using expects the 1.8 ruby interpreter to be present which it no longer is (as you have upgraded to 1.9).

    I would have thought that just running 'gem update' would fix your problem. If it doesn't, then you might need to seek an alternative gem for the one that is expecting the ruby 1.8 interpreter to be present.

    0 讨论(0)
提交回复
热议问题