我正在编写一个脚本来从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]
由于
答案 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,以深入研究捆绑程序代码。