Ruby - 如何在.rb文件中找出给定Gem的所有依赖项?

时间:2014-06-11 17:50:08

标签: ruby

如何在.rb文件中找出给定Gem的所有依赖项 而不必依赖system()或类似的外部调用?

考虑这个项目:

https://rubygems.org/gems/diamond_shell

它有大约20 - 25个依赖项。

我需要在所有链接上遍历所有依赖项 依赖项,并使用所有这些依赖项填充数组。

编辑:感谢您的回答。

2 个答案:

答案 0 :(得分:3)

您可以从lib/rubygems/commands/dependency_command.rb中抽出代码。这是我制作的一个简单方法。

require 'rubygems/commands/dependency_command'

def get_dependencies name, local = true
  cmd = Gem::Commands::DependencyCommand.new

  dependency = cmd.gem_dependency name, nil, nil

  specs =
  if local
    dependency.matching_specs.uniq.sort
  else
    cmd.fetch_remote_specs(dependency).uniq.sort
  end

  dependencies = []
  specs.each do |spec|
    dependencies.concat spec.dependencies.sort_by { |dep| dep.name }.map { |dep| [dep.name, dep.requirement] }
  end
  dependencies
end

puts get_dependencies('diamond_shell', false)

答案 1 :(得分:2)

如果您正在使用Bundler进行ruby gem管理(http://bundler.io),bundle install运行会生成包含所有项目gem及其依赖项的Gemfile.lock清单文件。一个例子如下:

sunspot (2.0.0)
  pr_geohash (~> 1.0)
  rsolr (~> 1.0.7)
sunspot_rails (2.0.0)
  nokogiri
  sunspot (= 2.0.0)
teaspoon (0.7.8)
  phantomjs (>= 1.8.1.1)
  railties (>= 3.2.5, < 5)

可以轻松解析此文件以获取依赖关系树。