如何找出gem的所有依赖项?

我一直试图找出ruby-gem的依赖关系。 我知道gem依赖命令会让我知道gem的依赖关系。 但我想做的不止于此。 我还想知道gem dependency命令生成的那些gem的依赖关系。 我的意思是,我想找到所有的gem,直到最后一颗gem,我的gem依赖于gem。

任何指针将不胜感激。 提前致谢。

注意:想法是构建类似https://www.gemlou.pe/的东西

下面的类将递归地获取gem依赖项(请注意它的概念certificate,因此它不做任何花哨的事情,但它是一个很好的起点)。 有关文档,请参阅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 

您可以在您的应用程序或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 

例如,会给你一个列表

  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)) 

在输出包含反向依赖项

更多关于$ gem dependency http://guides.rubygems.org/command-reference/#gem_dependency

更新

根据我在网上做过的研究,在向同事和其他人询问了这个主题后,我得出结论,目前没有办法可以使用$ gem dependency来找出完整的gem依赖关系列表。 。

编写类似于您在更新的问题中指出的gem的gem不应该非常复杂。 我相信人们可以通过编写一个简单的递归循环并获取gem信息(也许是理想的格式)来做到这一点。

我想我放弃了这个主题,但有人可以为其他人(不是我)开始赏金,他们可以想到除了https://www.gemlou.pe之外的“获得递归gem依赖的最佳方法”我觉得很好。