2011-12-13 105 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')) 

,一切都很好地工作!

相關問題