Как я узнаю, установлен ли драгоценный камень в системе или нет? - PullRequest
4 голосов
/ 13 декабря 2011

Как узнать, установлен ли в системе гем или нет?

%x('gem' 'list').split.find{|i| i == "capybara"}

Есть ли более короткий метод?

Ответы [ 4 ]

15 голосов
/ 13 декабря 2011

Если вы пытаетесь сделать это из ruby, вы можете использовать встроенный метод RubyGem. Более старые версии предоставляют метод Gem.available?('capybara'), который возвращает логическое значение, но это не рекомендуется. Теперь рекомендуется использовать (при условии, что вы используете версию, которая поддерживает его):

Gem::Specification::find_by_name('capybara')

http://rubygems.rubyforge.org/rubygems-update/Gem/Specification.html

Обновление

Если вы хотите получить логический результат, вы можете использовать .find_all_by_name() и проверить, является ли результирующий массив пустым:

if Gem::Specification::find_all_by_name('capybara').any?
  # Gem is available
end
3 голосов
/ 11 апреля 2012

Я втыкаю это в начало моего Gemfile:

def gem_available?(gemname)
  if Gem::Specification.methods.include?(:find_all_by_name) 
    not Gem::Specification.find_all_by_name(gemname).empty?
   else
     Gem.available?(gemname)
   end
 end

, затем просто использую:

if (gem_available?('gem_i_need'))

и все прекрасно работает!

3 голосов
/ 13 декабря 2011
%x('gem' 'list' | 'grep' 'capybara').empty?
1 голос
/ 13 декабря 2011

Вот код, который работает для меня. Он также правильно обрабатывает Gem::LoadError, который выдается при попытке загрузить камень, который не может быть найден.

require 'rubygems'

def can_we_find_gem(gem_name)
  found_gem = false
  begin
    found_gem = Gem::Specification.find_by_name(gem_name)
  rescue Gem::LoadError
    puts "Could not find gem '#{gem_name}'"
  else
    puts "Found gem '#{gem_name}'"
  end
end

can_we_find_gem('chef')
can_we_find_gem('not-chef')
...