class Bundler::Source::RubygemsAggregate
属性
source_map[R]
sources[R]
公共类方法
new(sources, source_map) 点击切换源代码
# File bundler/source/rubygems_aggregate.rb, line 8 def initialize(sources, source_map) @sources = sources @source_map = source_map @index = build_index end
公共实例方法
identifier() 点击切换源代码
# File bundler/source/rubygems_aggregate.rb, line 19 def identifier to_s end
specs() 点击切换源代码
# File bundler/source/rubygems_aggregate.rb, line 15 def specs @index end
to_s() 点击切换源代码
# File bundler/source/rubygems_aggregate.rb, line 23 def to_s "any of the sources" end
私有实例方法
build_index() 点击切换源代码
# File bundler/source/rubygems_aggregate.rb, line 29 def build_index Index.build do |idx| dependency_names = source_map.pinned_spec_names sources.all_sources.each do |source| source.dependency_names = dependency_names - source_map.pinned_spec_names(source) idx.add_source source.specs dependency_names.concat(source.unmet_deps).uniq! end double_check_for_index(idx, dependency_names) end end
double_check_for_index(idx, dependency_names) 点击切换源代码
假设 gem Foo 依赖于 gem Bar。Foo 存在于Source
A 中。Bar 在源 A 和 B 中都有一些版本。此时,API 请求将找到源 A 中 Bar 的所有版本,但不会找到源 B 中 Bar 的任何版本,如果请求的 Foo 版本专门依赖于仅在源 B 中找到的 Bar 版本,这将是一个问题。这确保了对于我们找到的每个 spec,我们都会将所有源中的所有可能版本添加到索引中。
# File bundler/source/rubygems_aggregate.rb, line 48 def double_check_for_index(idx, dependency_names) pinned_names = source_map.pinned_spec_names names = :names # do this so we only have to traverse to get dependency_names from the index once unmet_dependency_names = lambda do return names unless names == :names new_names = sources.all_sources.map(&:dependency_names_to_double_check) return names = nil if new_names.compact! names = new_names.flatten(1).concat(dependency_names) names.uniq! names -= pinned_names names end sources.all_sources.each do |source| source.double_check_for(unmet_dependency_names) end end