3

我正在编写一个脚本来从 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

4 回答 4

4

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

Bundler::Definition.build('Gemfile', nil, {}).dependencies

这里的“Gemfile”应该是从当前文件到 Gemfile 的路径。

归功于 Troy Verbrugge 对捆绑程序代码的深入研究。

于 2019-10-25T15:35:20.687 回答
2

使用这样的东西:

repos = Gem.loaded_specs.values
repos.each do |repo|
  g_em = repo.name
  s_ource = repo.source
end
于 2014-05-19T19:47:44.593 回答
1

以防万一您想从给定的 Gemfile.lock 中解析。那么以下是给我的提示:

Bundler::LockfileParser.new(Bundler.read_file("Gemfile.lock"))

于 2020-04-29T16:27:50.093 回答
0

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

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

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

您还可以使用 Bundler 解析 Gemfile.lock 以避免 eval 问题。

于 2013-08-06T18:24:47.203 回答