¿Cómo puedo saber todas las dependencias de una gem?

He estado tratando de encontrar dependencias para una gem Ruby. Sé que el comando de dependencia de gem me informará sobre las dependencias de la gem. Pero quiero hacer más que eso. También quiero saber las dependencias de esas gems generadas por el comando gem dependency. Quiero decir, quiero descubrir todas las gems hasta la última, de la que depende mi gem.

Cualquier puntero será apreciado. Gracias por adelantado.

Nota: la idea es construir algo como https://www.gemlou.pe/

La clase siguiente obtendrá recursivamente dependencias de gems (tenga en cuenta su prueba de concepto para que no haga nada sofisticado, pero es un buen punto de partida). para documentación, consulte rubydocs: Gem :: Dependency and 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 

Puedes usarlo programáticamente en tu aplicación o desde la consola ruby:

 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"=>{}}}} 
 $ gem dependency nokogiri -R 

por ejemplo te dará una lista como

  Gem nokogiri-1.6.0 hoe (~> 2.16, development) hoe-bundler (>= 1.1, development) hoe-debugging (>= 1.0.3, development) hoe-gemspec (>= 1.0, development) hoe-git (>= 1.4, development) mini_portile (~> 0.5.0) minitest (~> 2.2.2, development) racc (>= 1.4.6, development) rake (>= 0.9, development) rake-compiler (~> 0.8.0, development) rdoc (~> 3.10, development) rexical (>= 1.0.5, development) Used by haml-4.0.3 (nokogiri (>= 0, development)) mime-types-1.23 (nokogiri (~> 1.5, development)) redcarpet-2.3.0 (nokogiri (>= 0, development)) tilt-1.4.1 (nokogiri (>= 0, development)) 

que incluyen dependencias inversas en la salida

Más sobre la $ gem dependency http://guides.rubygems.org/command-reference/#gem_dependency

actualizar

De acuerdo con la investigación que he realizado en la web, y luego de haber preguntado sobre este tema a mis colegas y otras personas, llegué a la conclusión de que no hay forma de que uno pueda usar la $ gem dependency para encontrar la lista recursiva completa de las dependencias de gems .

Escribir una gem de Ruby similar a la que ha indicado en su pregunta actualizada no debería ser muy complicado. Creo que uno puede hacer esto escribiendo un simple bucle recursivo y buscando información de gems, tal vez en un formato deseable.

Creo que me doy por vencido en este tema, pero alguien podría comenzar una recompensa por otra persona (no por mí) que podría pensar en “la mejor manera de obtener dependencias de gems recursivas” aparte de https://www.gemlou.pe, que Creo que es bueno.