class Gem::Resolver::InstallerSet
一组用于安装的 gem,来源于远程源和本地 .gem 文件
公共类方法
new(domain) 点击切换源代码
创建一个新的 InstallerSet
,它将在 domain
中查找 gem。
调用超类方法
# File rubygems/resolver/installer_set.rb, line 38 def initialize(domain) super() @domain = domain @f = Gem::SpecFetcher.fetcher @always_install = [] @ignore_dependencies = false @ignore_installed = false @local = {} @local_source = Gem::Source::Local.new @remote_set = Gem::Resolver::BestSet.new @force = false @specs = {} end
公共实例方法
add_always_install(dependency) 点击切换源代码
查找 dependency
的最新规范,并将其添加到 always_install 列表中。
# File rubygems/resolver/installer_set.rb, line 59 def add_always_install(dependency) request = Gem::Resolver::DependencyRequest.new dependency, nil found = find_all request found.delete_if do |s| s.version.prerelease? && !s.local? end unless dependency.prerelease? found = found.select do |s| Gem::Source::SpecificFile === s.source || Gem::Platform.match_spec?(s) end found = found.sort_by do |s| [s.version, Gem::Platform.sort_priority(s.platform)] end newest = found.last unless newest exc = Gem::UnsatisfiableDependencyError.new request exc.errors = errors raise exc end unless @force found_matching_metadata = found.reverse.find do |spec| metadata_satisfied?(spec) end if found_matching_metadata.nil? ensure_required_ruby_version_met(newest.spec) ensure_required_rubygems_version_met(newest.spec) else newest = found_matching_metadata end end @always_install << newest.spec end
add_local(dep_name, spec, source) 点击切换源代码
添加一个使用 dep_name
请求的本地 gem,使用给定的 spec
,并且可以使用 source
加载和安装。
# File rubygems/resolver/installer_set.rb, line 106 def add_local(dep_name, spec, source) @local[dep_name] = [spec, source] end
errors() 点击切换源代码
解析 gem 时遇到的错误
# File rubygems/resolver/installer_set.rb, line 127 def errors @errors + @remote_set.errors end
find_all(req) 点击切换源代码
返回一个匹配 DependencyRequest req
的 IndexSpecification 对象数组。
# File rubygems/resolver/installer_set.rb, line 135 def find_all(req) res = [] dep = req.dependency return res if @ignore_dependencies && @always_install.none? {|spec| dep.match? spec } name = dep.name dep.matching_specs.each do |gemspec| next if @always_install.any? {|spec| spec.name == gemspec.name } res << Gem::Resolver::InstalledSpecification.new(self, gemspec) end unless @ignore_installed matching_local = [] if consider_local? matching_local = @local.values.select do |spec, _| req.match? spec end.map do |spec, source| Gem::Resolver::LocalSpecification.new self, spec, source end res.concat matching_local begin if local_spec = @local_source.find_gem(name, dep.requirement) res << Gem::Resolver::IndexSpecification.new( self, local_spec.name, local_spec.version, @local_source, local_spec.platform ) end rescue Gem::Package::FormatError # ignore end end res.concat @remote_set.find_all req if consider_remote? && matching_local.empty? res end
prefetch(reqs) 点击切换源代码
# File rubygems/resolver/installer_set.rb, line 179 def prefetch(reqs) @remote_set.prefetch(reqs) if consider_remote? end
prerelease=(allow_prerelease) 点击切换源代码
调用超类方法
# File rubygems/resolver/installer_set.rb, line 183 def prerelease=(allow_prerelease) super @remote_set.prerelease = allow_prerelease end
私有实例方法
metadata_satisfied?(spec) 点击切换源代码
# File rubygems/resolver/installer_set.rb, line 246 def metadata_satisfied?(spec) spec.required_ruby_version.satisfied_by?(Gem.ruby_version) && spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version) end