2013-08-06 46 views
1

我寫一個腳本來從Gemfile中所有寶石從軌project.Script是這樣解析的Gemfile並獲得在軌使用的所有寶石項目

 @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

也許你可以在你的項目目錄中運行「包秀」,並保存返回值解析,以避免直接解析的Gemfile和照顧的特殊情況下,像你的最後一個例子。在腳本中運行shell命令。但我還沒有嘗試過自己呢.. – Mattherick

回答

1

得到問題Gemnasium解析器可能是一個很好的解決方案

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

您還可以使用Bundler直接執行此操作,但您有冒險評估您不知道的Ruby代碼。

你也可以使用Bundler來解析Gemfile.lock,它避免了eval問題。

+0

我會避免使用gemnasium。使用正則表達式無法解析類似if的命令。我會和捆綁者一起去 – kbrock

3

使用這樣的事情:

repos = Gem.loaded_specs.values 
repos.each do |repo| 
    g_em = repo.name 
    s_ource = repo.source 
end 
相關問題