15

我正在使用Spring 应用程序预加载器,并且刚刚升级到 v 0.9.0。现在我收到以下警告:

警告:运行gem pristine --all以重新生成已安装的 gemspecs 将提高 Spring 的启动性能。

我尝试运行该命令,但它无法安装我的一些 gem,这可能与我最近升级到 OS X Mavericks 有关。我如何摆脱这个警告?

4

2 回答 2

15

这是因为以前版本的 ruby​​gems 会在查询时加载所有 gemspecs。

开始时这很慢,并且安装的 gem 越多越慢。

但是对于 Rubygems 2.1,它有一个“存根”的 gemspec,加载速度非常快。有关更多信息,请参阅https://github.com/rubygems/rubygems/pull/435

spring 人利用这一点在加载 bin/spring 时不加载每一个 gemspec,它只使用一个小数字来调用 spring 服务器。

它正在做的测试(假设你有 RubyGems 2.1 或更高版本)基本上是:

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

如果该列表不为空,则它知道您有较旧的宝石;使用 RubyGems < 2.1 安装的 gem。

您可以使用该信息生成要运行的 gem 列表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任何宝石都会给它带来问题。

于 2014-03-26T04:30:56.420 回答
5

我不完全理解问题的根源,但我能够通过删除无法安装的 gem 然后重新运行来摆脱警告gem pristine --all。这可能不是一个大问题,但我想我会发布我的解决方案,以防其他人遇到同样的问题。

于 2013-11-01T12:20:03.147 回答