class Gem::RequestSet
Ein RequestSet gruppiert eine Anforderung, eine Reihe von Abhängigkeiten zu aktivieren.
nokogiri = Gem::Dependency.new 'nokogiri', '~> 1.6' pg = Gem::Dependency.new 'pg', '~> 0.14' set = Gem::RequestSet.new nokogiri, pg requests = set.resolve p requests.map { |r| r.full_name } #=> ["nokogiri-1.6.0", "mini_portile-0.5.1", "pg-0.17.0"]
Attribute
Array von Gems, die installiert werden sollen, auch wenn sie bereits installiert sind
Setzen Sie auf true, wenn Sie nur direkte Entwicklungsabhängigkeiten installieren möchten.
Fehler beim Abrufen von Gems während der Auflösung.
Wenn true, wird keine Abhängigkeitsauflösung durchgeführt, nur die angeforderten Gems werden installiert.
Wenn true, erlauben Sie Abhängigkeiten, Prerelease-Gems abzugleichen.
Wenn false, werden keine Remote-Sets zur Auflösung von Gems verwendet.
Fehlende Abhängigkeiten als stille Fehler behandeln
Der Satz von Quell-Gems, die über load_gemdeps importiert wurden.
Öffentliche Klassenmethoden
Source
# File lib/rubygems/request_set.rb, line 94 def initialize(*deps) @dependencies = deps @always_install = [] @conservative = false @dependency_names = {} @development = false @development_shallow = false @errors = [] @git_set = nil @ignore_dependencies = false @install_dir = Gem.dir @prerelease = false @remote = true @requests = [] @sets = [] @soft_missing = false @sorted_requests = nil @specs = nil @vendor_set = nil @source_set = nil yield self if block_given? end
Erstellt einen RequestSet für eine Liste von Gem::Dependency-Objekten, deps. Sie können dann die aufgelistete Liste von Abhängigkeiten mit resolve und install auflösen und installieren.
nokogiri = Gem::Dependency.new 'nokogiri', '~> 1.6' pg = Gem::Dependency.new 'pg', '~> 0.14' set = Gem::RequestSet.new nokogiri, pg
Öffentliche Instanzmethoden
Source
# File lib/rubygems/request_set.rb, line 122 def gem(name, *reqs) if dep = @dependency_names[name] dep.requirement.concat reqs else dep = Gem::Dependency.new name, *reqs @dependency_names[name] = dep @dependencies << dep end end
Deklarieren Sie, dass ein Gem mit dem Namen name und den Anforderungen reqs benötigt wird.
Source
# File lib/rubygems/request_set.rb, line 135 def import(deps) @dependencies.concat deps end
Fügen Sie deps Gem::Dependency-Objekte zum Set hinzu.
Source
# File lib/rubygems/request_set.rb, line 146 def install(options, &block) # :yields: request, installer if dir = options[:install_dir] requests = install_into dir, false, options, &block return requests end @prerelease = options[:prerelease] requests = [] download_queue = Thread::Queue.new # Create a thread-safe list of gems to download sorted_requests.each do |req| download_queue << req end # Create N threads in a pool, have them download all the gems threads = Array.new(Gem.configuration.concurrent_downloads) do # When a thread pops this item, it knows to stop running. The symbol # is queued here so that there will be one symbol per thread. download_queue << :stop Thread.new do # The pop method will block waiting for items, so the only way # to stop a thread from running is to provide a final item that # means the thread should stop. while req = download_queue.pop break if req == :stop req.spec.download options unless req.installed? end end end # Wait for all the downloads to finish before continuing threads.each(&:value) # Install requested gems after they have been downloaded sorted_requests.each do |req| if req.installed? && @always_install.none? {|spec| spec == req.spec.spec } req.spec.spec.build_extensions yield req, nil if block_given? next end spec = begin req.spec.install options do |installer| yield req, installer if block_given? end rescue Gem::RuntimeRequirementNotMetError => e suggestion = "There are no versions of #{req.request} compatible with your Ruby & RubyGems" suggestion += ". Maybe try installing an older version of the gem you're looking for?" unless @always_install.include?(req.spec.spec) e.suggestion = suggestion raise end requests << spec end return requests if options[:gemdeps] install_hooks requests, options requests end
Installiert Gems für diesen RequestSet unter Verwendung des Gem::Installer options.
Wenn ein Block gegeben ist, werden eine Aktivierungsanforderung request und ein installer übergeben. Der installer wird nil sein, wenn ein Gem, das der Anforderung entspricht, bereits installiert wurde.
Source
# File lib/rubygems/request_set.rb, line 219 def install_from_gemdeps(options, &block) gemdeps = options[:gemdeps] @install_dir = options[:install_dir] || Gem.dir @prerelease = options[:prerelease] @remote = options[:domain] != :local @conservative = true if options[:conservative] gem_deps_api = load_gemdeps gemdeps, options[:without_groups], true resolve if options[:explain] puts "Gems to install:" sorted_requests.each do |spec| puts " #{spec.full_name}" end if Gem.configuration.really_verbose @resolver.stats.display end else installed = install options, &block if options.fetch :lock, true lockfile = Gem::RequestSet::Lockfile.build self, gemdeps, gem_deps_api.dependencies lockfile.write end installed end end
Installiert aus den Gem-Abhängigkeitsdateien in der Option :gemdeps in options und übergibt den Block wie in install.
Wenn :without_groups in den options angegeben ist, werden diese Gruppen in der Gem-Abhängigkeitsdatei nicht verwendet. Weitere options finden Sie unter Gem::Installer.
Source
# File lib/rubygems/request_set.rb, line 295 def install_hooks(requests, options) specs = requests.map do |request| case request when Gem::Resolver::ActivationRequest then request.spec.spec else request end end require_relative "dependency_installer" inst = Gem::DependencyInstaller.new options inst.installed_gems.replace specs Gem.done_installing_hooks.each do |hook| hook.call inst, specs end unless Gem.done_installing_hooks.empty? end
Aufrufe von Hooks auf installierte Gems
Source
# File lib/rubygems/request_set.rb, line 254 def install_into(dir, force = true, options = {}) gem_home = ENV["GEM_HOME"] ENV["GEM_HOME"] = dir existing = force ? [] : specs_in(dir) existing.delete_if {|s| @always_install.include? s } dir = File.expand_path dir installed = [] options[:development] = false options[:install_dir] = dir options[:only_install_dir] = true @prerelease = options[:prerelease] sorted_requests.each do |request| spec = request.spec if existing.find {|s| s.full_name == spec.full_name } yield request, nil if block_given? next end spec.install options do |installer| yield request, installer if block_given? end installed << request end install_hooks installed, options installed ensure ENV["GEM_HOME"] = gem_home end
Source
# File lib/rubygems/request_set.rb, line 317 def load_gemdeps(path, without_groups = [], installing = false) @git_set = Gem::Resolver::GitSet.new @vendor_set = Gem::Resolver::VendorSet.new @source_set = Gem::Resolver::SourceSet.new @git_set.root_dir = @install_dir lock_file = "#{File.expand_path(path)}.lock" begin tokenizer = Gem::RequestSet::Lockfile::Tokenizer.from_file lock_file parser = tokenizer.make_parser self, [] parser.parse rescue Errno::ENOENT end gf = Gem::RequestSet::GemDependencyAPI.new self, path gf.installing = installing gf.without_groups = without_groups if without_groups gf.load end
Lädt eine Abhängigkeitsverwaltungsdatei.
Source
# File lib/rubygems/request_set.rb, line 384 def resolve(set = Gem::Resolver::BestSet.new) @sets << set @sets << @git_set @sets << @vendor_set @sets << @source_set set = Gem::Resolver.compose_sets(*@sets) set.remote = @remote set.prerelease = @prerelease resolver = Gem::Resolver.new @dependencies, set resolver.development = @development resolver.development_shallow = @development_shallow resolver.ignore_dependencies = @ignore_dependencies resolver.soft_missing = @soft_missing if @conservative installed_gems = {} Gem::Specification.find_all do |spec| (installed_gems[spec.name] ||= []) << spec end resolver.skip_gems = installed_gems end @resolver = resolver @requests = resolver.resolve @errors = set.errors @requests end
Löst die angeforderten Abhängigkeiten auf und gibt ein Array von Spezifikationsobjekten zurück, die aktiviert werden sollen.
Source
# File lib/rubygems/request_set.rb, line 421 def resolve_current resolve Gem::Resolver::CurrentSet.new end
Source
# File lib/rubygems/request_set.rb, line 425 def sorted_requests @sorted_requests ||= strongly_connected_components.flatten end
Source
# File lib/rubygems/request_set.rb, line 429 def specs @specs ||= @requests.map(&:full_spec) end
Source
# File lib/rubygems/request_set.rb, line 433 def specs_in(dir) Gem::Util.glob_files_in_dir("*.gemspec", File.join(dir, "specifications")).map do |g| Gem::Specification.load g end end