2011-12-13 88 views

回答

3
%x('gem' 'list' | 'grep' 'capybara').empty? 
15

如果你想从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 
+0

如果它没有找到给定的宝石它给出了吨错误我该如何处理?我正在寻找简单的事情,如TRUE或无。 – pankajdoharey

+2

+1 RubyGems是一个* Ruby *库。从Ruby泄露出来的“gem”有很多种不同的错误。只需使用API​​。 –

+0

即使我想使用库,但它没有找到宝石时会产生太多错误 – pankajdoharey

1

下面是一些适用于我的代码。它还会正确处理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') 
+0

围绕抛出和捕获错误的设计代码并不好。 – Automatico

+0

投掷和捕捉错误是非常基本的错误处理。当我尝试打开文件以查看它们是否已成功打开时,我会做同样的事情。我认为您的评论可能还有其他内容,如果您想澄清或扩展它,会很高兴。 –

+0

当你不知道错误的原因时,捕捉错误是很好的,但是设计系统依靠捕捉错误并不是很好的设计。您应该制作验证函数不会抛出错误的方法。例如,如果你使用一些自动错误记录系统,你将会得到大量没有任何意义的垃圾错误。 – Automatico

3

我坚持这个在我的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')) 

,一切都很好地工作!

相关问题