следующий класс будет рекурсивно получать зависимости от драгоценных камней (обратите внимание на его доказательство концепции, чтобы он не делал ничего необычного, но его хорошая отправная точка). для документации, пожалуйста, обратитесь rubydocs: Gem::Dependency и Gem::Specification
class GemRequirements
def initialize(name, version = nil)
@gem = Gem::Dependency.new(name, version)
end
def dependency_tree
@dependency_tree ||= {}.merge(get_dependency(@gem))
end
private
def get_dependency(gem_dependency)
spec = gem_dependency.matching_specs.first
dep_key = "#{gem_dependency.name} #{spec.version}"
hash = { dep_key => {} }
spec.runtime_dependencies.each do |spec_dependency|
spec_dependency_spec = spec_dependency.matching_specs.first
spec_dep_key = "#{spec_dependency.name} #{spec_dependency_spec.version}"
hash[dep_key][spec_dep_key] = get_dependency(spec_dependency)
end
hash
end
end
вы можете использовать его в вашем программно приложении или из рубиновой консоли:
r = GemRequirements.new 'rails'
r.dependency_tree
=> {"rails 3.2.12"=>
{"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"actionpack 3.2.12"=>
{"actionpack 3.2.12"=>
{"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"activemodel 3.2.12"=>
{"activemodel 3.2.12"=>
{"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"builder 3.0.4"=>{"builder 3.0.4"=>{}}}},
"rack-cache 1.2"=>
{"rack-cache 1.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
"builder 3.0.4"=>{"builder 3.0.4"=>{}},
"rack 1.4.5"=>{"rack 1.4.5"=>{}},
"rack-test 0.6.2"=>
{"rack-test 0.6.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
"journey 1.0.4"=>{"journey 1.0.4"=>{}},
"sprockets 2.2.2"=>
{"sprockets 2.2.2"=>
{"hike 1.2.1"=>{"hike 1.2.1"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}},
"rack 1.4.5"=>{"rack 1.4.5"=>{}},
"tilt 1.4.1"=>{"tilt 1.4.1"=>{}}}},
"erubis 2.7.0"=>{"erubis 2.7.0"=>{}}}},
"activerecord 3.2.12"=>
{"activerecord 3.2.12"=>
{"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"activemodel 3.2.12"=>
{"activemodel 3.2.12"=>
{"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"builder 3.0.4"=>{"builder 3.0.4"=>{}}}},
"arel 3.0.2"=>{"arel 3.0.2"=>{}},
"tzinfo 0.3.37"=>{"tzinfo 0.3.37"=>{}}}},
"activeresource 3.2.12"=>
{"activeresource 3.2.12"=>
{"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"activemodel 3.2.12"=>
{"activemodel 3.2.12"=>
{"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"builder 3.0.4"=>{"builder 3.0.4"=>{}}}}}},
"actionmailer 3.2.12"=>
{"actionmailer 3.2.12"=>
{"actionpack 3.2.12"=>
{"actionpack 3.2.12"=>
{"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"activemodel 3.2.12"=>
{"activemodel 3.2.12"=>
{"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"builder 3.0.4"=>{"builder 3.0.4"=>{}}}},
"rack-cache 1.2"=>
{"rack-cache 1.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
"builder 3.0.4"=>{"builder 3.0.4"=>{}},
"rack 1.4.5"=>{"rack 1.4.5"=>{}},
"rack-test 0.6.2"=>
{"rack-test 0.6.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
"journey 1.0.4"=>{"journey 1.0.4"=>{}},
"sprockets 2.2.2"=>
{"sprockets 2.2.2"=>
{"hike 1.2.1"=>{"hike 1.2.1"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}},
"rack 1.4.5"=>{"rack 1.4.5"=>{}},
"tilt 1.4.1"=>{"tilt 1.4.1"=>{}}}},
"erubis 2.7.0"=>{"erubis 2.7.0"=>{}}}},
"mail 2.4.4"=>
{"mail 2.4.4"=>
{"mime-types 1.21"=>{"mime-types 1.21"=>{}},
"treetop 1.4.12"=>
{"treetop 1.4.12"=>{"polyglot 0.3.3"=>{"polyglot 0.3.3"=>{}}}},
"i18n 0.6.4"=>{"i18n 0.6.4"=>{}}}}}},
"railties 3.2.12"=>
{"railties 3.2.12"=>
{"rake 10.1.0"=>{"rake 10.1.0"=>{}},
"rack-ssl 1.3.3"=>
{"rack-ssl 1.3.3"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
"thor 0.18.1"=>{"thor 0.18.1"=>{}},
"rdoc 3.12.2"=>{"rdoc 3.12.2"=>{"json 1.8.1"=>{"json 1.8.1"=>{}}}},
"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"actionpack 3.2.12"=>
{"actionpack 3.2.12"=>
{"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"activemodel 3.2.12"=>
{"activemodel 3.2.12"=>
{"activesupport 3.2.12"=>
{"activesupport 3.2.12"=>
{"i18n 0.6.4"=>{"i18n 0.6.4"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}}}},
"builder 3.0.4"=>{"builder 3.0.4"=>{}}}},
"rack-cache 1.2"=>
{"rack-cache 1.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
"builder 3.0.4"=>{"builder 3.0.4"=>{}},
"rack 1.4.5"=>{"rack 1.4.5"=>{}},
"rack-test 0.6.2"=>
{"rack-test 0.6.2"=>{"rack 1.4.5"=>{"rack 1.4.5"=>{}}}},
"journey 1.0.4"=>{"journey 1.0.4"=>{}},
"sprockets 2.2.2"=>
{"sprockets 2.2.2"=>
{"hike 1.2.1"=>{"hike 1.2.1"=>{}},
"multi_json 1.8.2"=>{"multi_json 1.8.2"=>{}},
"rack 1.4.5"=>{"rack 1.4.5"=>{}},
"tilt 1.4.1"=>{"tilt 1.4.1"=>{}}}},
"erubis 2.7.0"=>{"erubis 2.7.0"=>{}}}}}},
"bundler 1.3.5"=>{"bundler 1.3.5"=>{}}}}
Посмотрите на ** Gemfile.lock **, для зависимостей развитий выглядят at * rubygems.org * –
Но как вы это делаете с 'gem dependency [] -R'? @Pseeyush Gupta, я начну щедрость, если не поступят ответы (несколько дней) – Davit