class Gem::Resolver
Bei einer Menge von Gem::Dependency-Objekten als needed und einer Möglichkeit, die Menge der verfügbaren Spezifikationen über set abzufragen, wird eine Menge von ActivationRequest-Objekten berechnet, die alle Spezifikationen angeben, die aktiviert werden sollten, um alle Anforderungen zu erfüllen.
Constants
- DEBUG_RESOLVER
-
Wenn die Umgebungsvariable
DEBUG_RESOLVERgesetzt ist, wird der Debugging-Modus für den Resolver aktiviert. Dies zeigt Informationen über den Zustand des Resolvers an, während eine Menge von Abhängigkeiten aufgelöst wird. - SINGLE_POSSIBILITY_CONSTRAINT_PENALTY
Attribute
Auf true gesetzt, wenn alle Entwicklungsabhängigkeiten berücksichtigt werden sollen.
Auf true gesetzt, wenn unmittelbare Entwicklungsabhängigkeiten berücksichtigt werden sollen.
Wenn true, werden keine Abhängigkeiten für angeforderte Gems nachgeschlagen.
Hash von zu überspringenden Gems. Schlüssel sind Gem-Namen, Werte sind Arrays von Gem-Spezifikationen.
Liste der Abhängigkeiten, die in den konfigurierten Quellen nicht gefunden werden konnten.
Öffentliche Klassenmethoden
Source
# File lib/rubygems/resolver.rb, line 59 def self.compose_sets(*sets) sets.compact! sets = sets.flat_map do |set| case set when Gem::Resolver::BestSet then set when Gem::Resolver::ComposedSet then set.sets else set end end case sets.length when 0 then raise ArgumentError, "one set in the composition must be non-nil" when 1 then sets.first else Gem::Resolver::ComposedSet.new(*sets) end end
Kombiniert sets zu einem ComposedSet, das die Spezifikationssuche auf einheitliche Weise ermöglicht. Wenn eines der sets selbst ein ComposedSet ist, werden seine Sets in das resultierende ComposedSet abgeflacht.
Source
# File lib/rubygems/resolver.rb, line 87 def self.for_current_gems(needed) new needed, Gem::Resolver::CurrentSet.new end
Erstellt einen Resolver, der nur gegen die bereits installierten Gems für die needed-Abhängigkeiten abfragt.
Source
# File lib/rubygems/resolver.rb, line 99 def initialize(needed, set = nil) @set = set || Gem::Resolver::IndexSet.new @needed = needed @development = false @development_shallow = false @ignore_dependencies = false @skip_gems = {} @soft_missing = false @stats = Gem::Resolver::Stats.new end
Öffentliche Instanzmethoden
Source
# File lib/rubygems/resolver.rb, line 271 def allow_missing?(dependency) @soft_missing end
Source
# File lib/rubygems/resolver.rb, line 252 def dependencies_for(specification) return [] if @ignore_dependencies spec = specification.spec requests(spec, specification) end
Source
# File lib/rubygems/resolver.rb, line 267 def name_for(dependency) dependency.name end
Source
# File lib/rubygems/resolver.rb, line 172 def output @output ||= debug? ? $stdout : File.open(IO::NULL, "w") end
Source
# File lib/rubygems/resolver.rb, line 258 def requirement_satisfied_by?(requirement, activated, spec) matches_spec = requirement.matches_spec? spec return matches_spec if @soft_missing matches_spec && spec.spec.required_ruby_version.satisfied_by?(Gem.ruby_version) && spec.spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version) end
Source
# File lib/rubygems/resolver.rb, line 185 def resolve Gem::Molinillo::Resolver.new(self, self).resolve(@needed.map {|d| DependencyRequest.new d, nil }).tsort.filter_map(&:payload) rescue Gem::Molinillo::VersionConflict => e conflict = e.conflicts.values.first raise Gem::DependencyResolutionError, Conflict.new(conflict.requirement_trees.first.first, conflict.existing, conflict.requirement) ensure @output.close if defined?(@output) && !debug? end
Fährt mit der Auflösung fort! Gibt ein Array von ActivationRequest-Objekten zurück.
Source
# File lib/rubygems/resolver.rb, line 223 def search_for(dependency) possibles, all = find_possible(dependency) if !@soft_missing && possibles.empty? exc = Gem::UnsatisfiableDependencyError.new dependency, all exc.errors = @set.errors raise exc end groups = Hash.new {|hash, key| hash[key] = [] } # create groups & sources in the same loop sources = possibles.map do |spec| source = spec.source groups[source] << spec source end.uniq.reverse activation_requests = [] sources.each do |source| groups[source]. sort_by {|spec| [spec.version, -Gem::Platform.platform_specificity_match(spec.platform, Gem::Platform.local)] }. map {|spec| ActivationRequest.new spec, dependency }. each {|activation_request| activation_requests << activation_request } end activation_requests end
Source
# File lib/rubygems/resolver.rb, line 275 def sort_dependencies(dependencies, activated, conflicts) dependencies.sort_by.with_index do |dependency, i| name = name_for(dependency) [ activated.vertex_named(name).payload ? 0 : 1, amount_constrained(dependency), conflicts[name] ? 0 : 1, activated.vertex_named(name).payload ? 0 : search_for(dependency).count, i, # for stable sort ] end end
Private Instanzmethoden
Source
# File lib/rubygems/resolver.rb, line 297 def amount_constrained(dependency) @amount_constrained ||= {} @amount_constrained[dependency.name] ||= begin name_dependency = Gem::Dependency.new(dependency.name) dependency_request_for_name = Gem::Resolver::DependencyRequest.new(name_dependency, dependency.requester) all = @set.find_all(dependency_request_for_name).size if all <= 1 all - SINGLE_POSSIBILITY_CONSTRAINT_PENALTY else search = search_for(dependency).size search - all end end end
Gibt eine ganze Zahl in (-infty, 0] zurück. Ein Wert näher an 0 bedeutet, dass die Abhängigkeit weniger einschränkend ist.
Abhängigkeiten mit 0 oder 1 Möglichkeit (ignoriert Versionsanforderungen) erhalten sehr negative Werte, sodass sie *immer* zuerst sortiert werden, vor Abhängigkeiten, die unbeschränkt sind.