class Gem::DependencyList
Gem::DependencyList wird verwendet, um Gems in der richtigen Reihenfolge zu installieren und zu deinstallieren, um Konflikte zu vermeiden.
Attribute
Ermöglicht das Aktivieren/Deaktivieren der Verwendung von Entwicklungsabhängigkeiten
Öffentliche Klassenmethoden
Source
# File lib/rubygems/dependency_list.rb, line 33 def self.from_specs list = new list.add(*Gem::Specification.to_a) list end
Erstellt eine DependencyList aus den aktuellen Specs.
Source
# File lib/rubygems/dependency_list.rb, line 43 def initialize(development = false) @specs = [] @development = development end
Erstellt eine neue DependencyList. Wenn development true ist, werden Entwicklungsabhängigkeiten einbezogen.
Öffentliche Instanzmethoden
Source
# File lib/rubygems/dependency_list.rb, line 52 def add(*gemspecs) @specs.concat gemspecs end
Fügt gemspecs zur Abhängigkeitsliste hinzu.
Source
# File lib/rubygems/dependency_list.rb, line 75 def dependency_order sorted = strongly_connected_components.flatten result = [] seen = {} sorted.each do |spec| if index = seen[spec.name] if result[index].version < spec.version result[index] = spec end else seen[spec.name] = result.length result << spec end end result.reverse end
Gibt eine Liste der Gem-Spezifikationen in der Abhängigkeitsliste zurück, sortiert in einer Reihenfolge, so dass keine Gemspezifikation in der Liste von einer früheren Gemspezifikation in der Liste abhängt.
Dies ist nützlich beim Entfernen von Gems aus einer Menge installierter Gems. Durch das Entfernen in der zurückgegebenen Reihenfolge vermeiden Sie so viele Abhängigkeitsprobleme.
Wenn es zirkuläre Abhängigkeiten gibt (igitt!), werden die Gems in Reihenfolge zurückgegeben, bis nur noch die zirkulären Abhängigen und alles, worauf sie verweisen, übrig sind. Dann werden willkürliche Gemspezifikationen zurückgegeben, bis die zirkuläre Abhängigkeit unterbrochen ist, danach werden Gems wieder in Abhängigkeitsreihenfolge zurückgegeben.
Source
# File lib/rubygems/dependency_list.rb, line 98 def each(&block) dependency_order.each(&block) end
Iterator über dependency_order
Source
# File lib/rubygems/dependency_list.rb, line 102 def find_name(full_name) @specs.find {|spec| spec.full_name == full_name } end
Source
# File lib/rubygems/dependency_list.rb, line 113 def ok? why_not_ok?(:quick).empty? end
Sind alle Abhängigkeiten in der Liste erfüllt?
Source
# File lib/rubygems/dependency_list.rb, line 142 def ok_to_remove?(full_name, check_dev = true) gem_to_remove = find_name full_name # If the state is inconsistent, at least don't crash return true unless gem_to_remove siblings = @specs.find_all do |s| s.name == gem_to_remove.name && s.full_name != gem_to_remove.full_name end deps = [] @specs.each do |spec| check = check_dev ? spec.dependencies : spec.runtime_dependencies check.each do |dep| deps << dep if gem_to_remove.satisfies_requirement?(dep) end end deps.all? do |dep| siblings.any? do |s| s.satisfies_requirement? dep end end end
Ist es in Ordnung, eine Gemspezifikation aus der Abhängigkeitsliste zu entfernen?
Wenn das Entfernen der Gemspezifikation eine aktuell erfüllte Abhängigkeit unterbricht, dann ist es NICHT in Ordnung, die Gemspezifikation zu entfernen.
Source
# File lib/rubygems/dependency_list.rb, line 185 def remove_by_name(full_name) @specs.delete_if {|spec| spec.full_name == full_name } end
Entfernt die Gemspezifikation, die mit full_name übereinstimmt, aus der Abhängigkeitsliste.
Source
# File lib/rubygems/dependency_list.rb, line 175 def remove_specs_unsatisfied_by(dependencies) specs.reject! do |spec| dep = dependencies[spec.name] dep && !dep.requirement.satisfied_by?(spec.version) end end
Entfernt alles in der DependencyList, das mit Einträgen in dependencies (ein Hash von Gem-Namen zu Arrays von Abhängigkeiten) übereinstimmt, aber diese nicht erfüllt.
Source
# File lib/rubygems/dependency_list.rb, line 193 def spec_predecessors result = Hash.new {|h,k| h[k] = [] } specs = @specs.sort.reverse specs.each do |spec| specs.each do |other| next if spec == other other.dependencies.each do |dep| if spec.satisfies_requirement? dep result[spec] << other end end end end result end
Gibt einen Hash von Vorgängern zurück. result[spec] ist ein Array von Gemspezifikationen, die eine Abhängigkeit haben, die von der benannten Gemspezifikation erfüllt wird.
Source
# File lib/rubygems/dependency_list.rb, line 217 def tsort_each_child(node) specs = @specs.sort.reverse dependencies = node.runtime_dependencies dependencies.push(*node.development_dependencies) if @development dependencies.each do |dep| specs.each do |spec| if spec.satisfies_requirement? dep yield spec break end end end end
Source
# File lib/rubygems/dependency_list.rb, line 213 def tsort_each_node(&block) @specs.each(&block) end
Source
# File lib/rubygems/dependency_list.rb, line 117 def why_not_ok?(quick = false) unsatisfied = Hash.new {|h,k| h[k] = [] } each do |spec| spec.runtime_dependencies.each do |dep| inst = Gem::Specification.any? do |installed_spec| dep.name == installed_spec.name && dep.requirement.satisfied_by?(installed_spec.version) end unless inst || @specs.find {|s| s.satisfies_requirement? dep } unsatisfied[spec.name] << dep return unsatisfied if quick end end end unsatisfied end
Private Instanzmethoden
Source
# File lib/rubygems/dependency_list.rb, line 239 def active_count(specs, ignored) specs.count {|spec| ignored[spec.full_name].nil? } end
Zählt die Anzahl der Gemspezifikationen in der Liste specs, die nicht in ignored enthalten sind.