# The version requirements are optional.
# You can also specify multiple version requirements, just append more at the end
gem_name, *gem_ver_reqs = 'json', '~> 1.8.0'
gdep = Gem::Dependency.new(gem_name, *gem_ver_reqs)
# find latest that satisifies
found_gspec = gdep.matching_specs.max_by(&:version)
# instead of using Gem::Dependency, you can also do:
# Gem::Specification.find_all_by_name(gem_name, *gem_ver_reqs)
if found_gspec
puts "Requirement '#{gdep}' already satisfied by #{found_gspec.name}-#{found_gspec.version}"
else
puts "Requirement '#{gdep}' not satisfied; installing..."
# reqs_string will be in the format: "> 1.0, < 1.2"
reqs_string = gdep.requirements_list.join(', ')
# multi-arg is safer, to avoid injection attacks
system('gem', 'install', gem_name, '-v', reqs_string)
end
最近RubyGems的版本提供了一個安裝程序的API,這樣反而脫殼而出的gem
命令你也可以使用:
# using the same "gdep" variable as above
Gem.install gem_name, gdep.requirement
不過,我不知道,如果Gem.install
方面您的.gemrc
文件。
查詢安裝的寶石有很多有用的方法(請參閱rdocs)。有些可能會有所幫助:
Gem::Specification.find_all_by_name
Gem::Requirement#satisfied_by?(gem_version_instance)
Gem::Specification#satisfies_requirement?(gem_dependency_instance)
Gem.loaded_specs
- 你已經通過gem
方法實際加載的寶石的哈希,或通過require
正是我所期待的完美答案,感謝提供幾個API方法的例子,而不僅僅是一個。 rubygems ruby code api很難得到一個概述性的理解,謝謝你的例子! – jrochkind