【发布时间】:2012-12-05 06:28:51
【问题描述】:
如何查看系统中是否安装了 gem?
%x('gem' 'list').split.find{|i| i == "capybara"}
有没有更短的方法?
【问题讨论】:
如何查看系统中是否安装了 gem?
%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 发起攻击是非常多不同的错误。只需使用 API。
empty? 以获得布尔值。
Gem::LoadError。为什么Gem.available? 被弃用对我来说有点神秘。
%x('gem' 'list' | 'grep' 'capybara').empty?
【讨论】:
我把它放在我的 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 时抛出的 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 语句是因为这是示例代码。随意在生产代码中省略它们。