Как избавиться от предупреждения Spring: Запуск `gem pristine -all`?

Я использую предварительный загрузчик Spring и просто обновлен до версии 0.9.0. Теперь я получаю следующее предупреждение:

Предупреждение. Выполнение gem pristine --all для восстановления установленных gemspecs улучшит производительность запуска Spring.

Я попробовал запустить эту команду, но не смог установить некоторые из моих драгоценных камней, которые могут иметь отношение к моему недавнему обновлению до OS X Mavericks. Как мне избавиться от этого предупреждения?

Ответы

Ответ 1

Это связано с тем, что предыдущие версии rubygems загружали все gemspecs всякий раз, когда запрашивались.

Это медленное начало и медленнее, чем больше камней установлены.

Но с Rubygems 2.1 у него есть "закодированный" gemspec, который очень быстро загружается. Подробнее см. https://github.com/rubygems/rubygems/pull/435.

Люди spring используют это, чтобы не загружать каждый отдельный gemspec при загрузке bin/ spring, который использует только небольшое число, чтобы вызывать сервер spring.

Тест, который он выполнял (если у вас есть RubyGems 2.1 или новее), по существу:

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

Если этот список не был пустым, он знал, что у вас есть более старые драгоценные камни; драгоценные камни, установленные с помощью RubyGems < 2.1.

Вы можете использовать эту информацию для создания списка драгоценных камней для запуска gem pristine on:

# /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 любые драгоценные камни, дающие ему проблему.

Ответ 2

Я не совсем понимаю источник , но я смог избавиться от предупреждения, удалив драгоценные камни, которые были не удалось установить, а затем перезапустить gem pristine --all. Это, вероятно, не большая проблема, но я решил, что опубликую свое решение, если кто-то другой столкнется с той же проблемой.