這個怎麼樣
require 'bundler'
dependencies = Bundler::Definition.build('Gemfile','Gemfile.lock',nil).
dependencies.each_with_object(Hash.new { |h,k| h[k] = [] }) do |dep,obj|
dep.groups.each do |g|
obj[g] << {name: dep.name,
required_version: dep.requirement.requirements.join,
actual_version: dep.to_spec.version.to_s
}
end
end
這將GROUP BY他們的小組所有依賴關係,並放置在包含他們的名字,他們需要的版本和他們的特定版本Hash
ES。例如:
{:default=>
[{:name=>"rake", :required_version=>"=11.3.0", :actual_version=>"11.3.0"},
{:name=>"rails", :required_version=>"=4.2.5.2", :actual_version=>"4.2.5.2"},
{:name=>"arel", :required_version=>"=6.0.3", :actual_version=>"6.0.3"},
{:name=>"activerecord",
:required_version=>"~>4.2.0",
:actual_version=>"4.2.8"},
{:name=>"activerecord-sqlserver-adapter",
:required_version=>"~>4.2.0",
:actual_version=>"4.2.18"},
{:name=>"tiny_tds", :required_version=>"~>0.7.0", :actual_version=>"0.7.0"}],
:doc=>
[{:name=>"sdoc", :required_version=>"~>0.4.0", :actual_version=>"0.4.2"}],
:development=>
[{:name=>"byebug", :required_version=>">=0", :actual_version=>"9.0.6"},
{:name=>"web-console",
:required_version=>"~>2.0",
:actual_version=>"2.3.0"},
{:name=>"capistrano",
:required_version=>"=3.7.2",
:actual_version=>"3.7.2"}],
:test=>
[{:name=>"byebug", :required_version=>">=0", :actual_version=>"9.0.6"}]}
BTW :default
是生產(可能需要進一步的處理依賴的依賴擴大我會看看我能做些什麼)
更新1:類似的格式列出了相關的:runtime
依賴(不uniq的)
def dep_to_hash(dep)
{name: dep.name,
required_version: dep.requirement.requirements.join,
actual_version: dep.to_spec.version.to_s,
dependencies: dep.to_spec.dependencies.select {|d| d.type == :runtime}.each_with_object(Hash.new { |h,k| h[k] = [] }) do |dep2,obj|
obj[dep2.type] << dep_to_hash(dep2)
end
}
end
deps = Bundler::Definition.build('Gemfile','Gemfile.lock',nil).
dependencies.each_with_object(Hash.new { |h,k| h[k] = [] }) do |dep,obj|
dep.groups.each do |g|
obj[g] << dep_to_hash(dep)
end
end
輸出段:
{:default=>
[{:name=>"rails",
:required_version=>"=4.2.5.2",
:actual_version=>"4.2.5.2",
:dependencies=>
{:runtime=>
[{:name=>"activesupport",
:required_version=>"=4.2.5.2",
:actual_version=>"4.2.5.2",
:dependencies=>
{:runtime=>
[{:name=>"i18n",
:required_version=>"~>0.7",
:actual_version=>"0.8.1",
:dependencies=>{}},
{:name=>"json",
:required_version=>">=1.7.7~>1.7",
:actual_version=>"1.8.6",
:dependencies=>{}},
更新2(更多像你看起來的樣子,現在需要定位,是uniq的由 「集團」)
require 'bundler'
def add_to_dep(dep,top_level)
deps = dep.to_spec.dependencies.select {|d| d.type == :runtime}
deps.each do |dep|
add_to_dep(dep,top_level)
end
# handle existing dependencies by using highest version
exists = top_level.grep(/#{dep.name}/)[0]
if exists
version = exists.split(',').last
new_version = dep.to_spec.version.to_s
if new_version > version
top_level.delete_at(top_level.index(exists))
top_level << "#{dep.name}, #{dep.to_spec.version}"
end
else
top_level << "#{dep.name}, #{dep.to_spec.version}"
end
end
deps = Bundler::Definition.build('Gemfile','Gemfile.lock',nil).
dependencies.each_with_object(Hash.new { |h,k| h[k] = [] }) do |dep,obj|
dep.groups.each do |g|
add_to_dep(dep,obj[g])
end
end.each {|_k,v| v.sort!}
輸出段:
{:default=>
["actionmailer, 4.2.5.2",
"actionpack, 4.2.8",
"actionview, 4.2.8",
"activejob, 4.2.5.2",
"activemodel, 4.2.8",
"activerecord, 4.2.8",
"activerecord-sqlserver-adapter, 4.2.18",
"activesupport, 4.2.8",
"arel, 6.0.4",
"axlsx, 2.0.1",
"builder, 3.2.3",
"bundler, 1.14.6",
"coffee-rails, 4.1.1",
"coffee-script, 2.4.1",
"coffee-script-source, 1.12.2",
"concurrent-ruby, 1.0.5",
"erubis, 2.7.0",
"execjs, 2.7.0",
"globalid, 0.4.0",
"hash-deep-merge, 0.1.1",
"htmlentities, 4.3.4",
"i18n, 0.8.1",
"jbuilder, 2.6.2",
"jquery-rails, 4.2.2",
"jquery-ui-rails, 6.0.1",
"json, 1.8.6",
"lazy_high_charts, 1.5.6",
"loofah, 2.0.3",
"mail, 2.6.5",
"mime-types, 3.1",
"mime-types-data, 3.2016.0521",
感謝您的答覆。對此,我真的非常感激。 locked_gems方法未定義在 def lock_file @ definition.locked_gems end 我該如何解決這個問題? 此外,我有一個印象,我需要在某處安裝需要.gem文件。 目前我有他們在 /供應商/緩存。 如何讓我的代碼找到它們? –
好的已解決。我只是取代它:lockfile_contents = File.read( 'Gemfile.lock的') 捆紮機:: LockfileParser.new(lockfile_contents) –
非常感謝你。 –