2013-11-01 54 views

回答

15

這是因爲以前版本的rubygems會在每次查詢時加載所有gemspecs。

這是開始緩慢,越慢安裝的寶石越多。

但與Rubygems 2.1它有一個「stubbed」gemspec是非常快加載。有關更多信息,請參閱https://github.com/rubygems/rubygems/pull/435

春天的人們利用這個優勢,不加載每一個gemspec時,只需加載bin/spring,只使用一個小號碼來呼叫春季服務器。

測試它是做(假設你有RubyGems的2.1或更高版本)基本上:

ruby -e 'p Gem::Specification.stubs.reject(&:stubbed?).reject(&:default_gem?).map(&:name)' 

如果該列表是不是空的,它知道你有舊的寶石;用RubyGems安裝的寶石< 2.1。

您可以利用這些信息來生成寶石的名單上運行gem pristine

# /tmp/dirty.rb 
require 'shellwords' 


Gem::Specification.stubs.reject(&:stubbed?).reject(&:default_gem?).each do |gemspec| 
    puts "gem pristine #{Shellwords.escape gemspec.name} --version #{Shellwords.escape gemspec.version.to_s}" 
end 

然後只需運行:

ruby /tmp/dirty.rb | bash 

但它更易於運行gem pristine --all和@Beerlington提到,gem uninstall任何寶石給它一個問題。

+0

雖然這並不能完全解決我在Ubuntu 14.04上遇到的問題,但它使我轉向了https://github.com/rails/spring/issues/320#issuecomment-252131401,這表明Ubuntu/Debian使用的軟件包'default_gem?'的行爲。 – ajsharma

5

我不完全理解source of the issue,但我能夠通過刪除未能安裝的寶石,然後重新運行gem pristine --all來擺脫警告。這可能不是一個大問題,但我想我會發布我的解決方案,以防其他人遇到同樣的問題。