Как узнать, установлен гем в системе или нет?
%x('gem' 'list').split.find{|i| i == "capybara"}
Есть ли более короткий метод?
Как узнать, установлен гем в системе или нет?
%x('gem' 'list').split.find{|i| i == "capybara"}
Есть ли более короткий метод?
Если вы пытаетесь сделать это изнутри 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
gem
из Ruby — это так много разных ошибок. Просто используйте API.
- person Jörg W Mittag; 13.12.2011
empty?
в конце, чтобы получить логическое значение.
- person Peter Brown; 13.12.2011
Gem::LoadError
, если драгоценный камень не найден (по состоянию на декабрь 2012 г.). Для меня немного загадочно, почему Gem.available?
устарел.
- person Eric Drechsel; 05.12.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'))
и все прекрасно работает!
Вот код, который работает для меня. Он также правильно обрабатывает ошибку 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')
puts
здесь потому, что это пример кода. Не стесняйтесь опускать их в производственном коде.
- person Dylan Northrup; 28.04.2014