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