解析gemfile并获取rails项目中使用的所有gem

时间:2013-08-06 16:29:50

标签: ruby-on-rails ruby-on-rails-3 gem

我正在编写一个脚本来从rails项目中获取gemfile中的所有gem。脚本就是这样的

     @gem_file_path=File.expand_path('../Gemfile', __FILE__) || ENV['BUNDLE_GEMFILE']      ||  Dir.pwd + "/Gemfile"
     File.open(gem_file_path).read.each_line do |i|
 i=i.split
      if i[0] == "gem" && i[0].start_with?("gem")
        name = i[1].gsub(",","") 
        gem_name= eval name
        author_email_id=Gem::Specification.find_by_name(gem_name.to_s).email
        author_name=Gem::Specification.find_by_name(gem_name).author
      end
     end

有更好的方法吗?因为我也会在gemfile和其他可能性中提到类似下面的内容时遇到问题

        gem 'rspec-rails',:group => [:test,:development]

由于

4 个答案:

答案 0 :(得分:3)

使用类似的东西:

repos = Gem.loaded_specs.values
repos.each do |repo|
  g_em = repo.name
  s_ource = repo.source
end

答案 1 :(得分:1)

Gemnasium-parser可能是一个很好的解决方案

https://github.com/gemnasium/gemnasium-parser

您也可以使用Bundler直接执行此操作,但是您冒着评估您不知道的红宝石代码的风险。

你也可以使用Bundler解析Gemfile.lock,避免eval问题。

答案 2 :(得分:1)

以防万一,您想从给定的Gemfile.lock中进行解析。然后,以下是给我的提示:

Bundler :: LockfileParser.new(Bundler.read_file(“ Gemfile.lock”))

答案 3 :(得分:0)

对于像我这样多年困扰这个问题的任何人,我发现您可以通过以下操作来访问Gemfile中引用的gem,而无需实际运行gemfile:

function customizerMergeActions(objValue, srcValue) {
    if (_.isArray(objValue)) {
        return _.merge(objValue, srcValue);
    }
}

此处的“ Gemfile”应该是当前文件中Gemfile的路径。

信用归功于Troy Verbrugge,以深入研究捆绑程序代码。