class Gem::Uninstaller
Ein Uninstaller.
Der Deinstaller löst Pre- und Post-Uninstall-Hooks aus. Hooks können entweder über eine rubygems_plugin.rb-Datei in einem installierten Gem oder über eine rubygems/defaults/#{RUBY_ENGINE}.rb- oder rubygems/defaults/operating_system.rb-Datei hinzugefügt werden. Siehe Gem.pre_uninstall und Gem.post_uninstall für Details.
Attribute
Das Verzeichnis, in das die ausführbaren Dateien eines Gems installiert werden
Das Gem-Repository, aus dem das Gem deinstalliert wird
Die Gem::Specification für das zu deinstallierende Gem, nur gesetzt während uninstall_gem
Öffentliche Klassenmethoden
Source
# File lib/rubygems/uninstaller.rb, line 63 def initialize(gem, options = {}) @gem = gem @version = options[:version] || Gem::Requirement.default @install_dir = options[:install_dir] @gem_home = File.realpath(@install_dir || Gem.dir) @user_dir = File.exist?(Gem.user_dir) ? File.realpath(Gem.user_dir) : Gem.user_dir @force_executables = options[:executables] @force_all = options[:all] @force_ignore = options[:ignore] @bin_dir = options[:bin_dir] @format_executable = options[:format_executable] @abort_on_dependent = options[:abort_on_dependent] @check_dev = options[:check_dev] if options[:force] @force_all = true @force_ignore = true end # only add user directory if install_dir is not set @user_install = false @user_install = options[:user_install] unless @install_dir # Optimization: populated during #uninstall @default_specs_matching_uninstall_params = [] end
Konstruiert einen Deinstaller, der das Gem mit dem Namen gem deinstallieren wird. options ist ein Hash mit den folgenden Schlüsseln
- :version
-
Versionsanforderung für das zu deinstallierende Gem. Wenn nicht angegeben, wird
Gem::Requirement.defaultverwendet. - :install_dir
-
Das Verzeichnis, in dem das Gem installiert ist. Wenn nicht angegeben, wird
Gem.dirverwendet. - :executables
-
Ob ausführbare Dateien ohne Bestätigung entfernt werden sollen oder nicht. Wenn nil, wird der Benutzer explizit gefragt.
- :all
-
Wenn mehr als eine Version der Anforderung entspricht, ob alle übereinstimmenden Versionen zwangsweise entfernt werden sollen oder ob der Benutzer aufgefordert werden soll, spezifische übereinstimmende Versionen auszuwählen, die entfernt werden sollen.
- :ignore
-
Ignoriere fehlerhafte Abhängigkeitsprüfungen beim Deinstallieren.
- :bin_dir
-
Verzeichnis, das zu entfernende ausführbare Dateien enthält. Wenn nicht angegeben, wird
Gem.bindirverwendet. - :format_executable
-
Um ausführbare Dateien zu finden, die entfernt werden sollen, werden ausführbare Namen mit
Gem::Installer.exec_formatformatiert. - :abort_on_dependent
-
Deinstallation direkt abbrechen, wenn Abhängigkeiten gebrochen würden, anstatt den Benutzer um Bestätigung zu bitten.
- :check_dev
-
Bei der Prüfung, ob die Deinstallation eines Gems zu fehlerhaften Abhängigkeiten führen würde, werden auch Entwicklung Abhängigkeiten berücksichtigt.
- :force
-
Setze sowohl :all als auch :ignore auf true für erzwungene Deinstallation.
- :user_install
-
Von Benutzer-Gem-Verzeichnis statt Systemverzeichnis deinstallieren.
Öffentliche Instanzmethoden
Source
# File lib/rubygems/uninstaller.rb, line 320 def path_ok?(gem_dir, spec) full_path = File.join gem_dir, "gems", spec.full_name original_path = File.join gem_dir, "gems", spec.original_name full_path == spec.full_gem_path || original_path == spec.full_gem_path end
Befindet sich spec in gem_dir?
Source
# File lib/rubygems/uninstaller.rb, line 310 def regenerate_plugins latest = specification_record.latest_spec_for(@spec.name) return if latest.nil? regenerate_plugins_for(latest, plugin_dir_for(@spec)) end
Generiert Plugin-Wrapper nach der Entfernung neu.
Source
# File lib/rubygems/uninstaller.rb, line 251 def remove(spec) unless path_ok?(@gem_home, spec) || (@user_install && path_ok?(@user_dir, spec)) e = Gem::GemNotInHomeException.new \ "Gem '#{spec.full_name}' is not installed in directory #{@gem_home}" e.spec = spec raise e end raise Gem::FilePermissionError, spec.base_dir unless File.writable?(spec.base_dir) full_gem_path = spec.full_gem_path exclusions = [] if default_spec_matches?(spec) && spec.executables.any? exclusions = spec.executables.map {|exe| File.join(spec.bin_dir, exe) } exclusions << File.dirname(exclusions.last) until exclusions.last == full_gem_path end safe_delete { rm_r full_gem_path, exclusions: exclusions } safe_delete { FileUtils.rm_r spec.extension_dir } old_platform_name = spec.original_name gem = spec.cache_file gem = File.join(spec.cache_dir, "#{old_platform_name}.gem") unless File.exist? gem safe_delete { FileUtils.rm_r gem } begin Gem::RDoc.new(spec).remove rescue NameError end gemspec = spec.spec_file unless File.exist? gemspec gemspec = File.join(File.dirname(gemspec), "#{old_platform_name}.gemspec") end safe_delete { FileUtils.rm_r gemspec } announce_deletion_of(spec) end
- spec
-
Die Spezifikation des zu deinstallierenden Gems
Source
# File lib/rubygems/uninstaller.rb, line 244 def remove_all(list) list.each {|spec| uninstall_gem spec } end
Entfernt alle Gems in list.
HINWEIS: Entfernt deinstallierte Gems aus list.
Source
# File lib/rubygems/uninstaller.rb, line 190 def remove_executables(spec) return if spec.executables.empty? || default_spec_matches?(spec) executables = spec.executables.clone # Leave any executables created by other installed versions # of this gem installed. list = Gem::Specification.find_all do |s| s.name == spec.name && s.version != spec.version end list.each do |s| s.executables.each do |exe_name| executables.delete exe_name end end return if executables.empty? executables = executables.map {|exec| formatted_program_filename exec } remove = if @force_executables.nil? ask_yes_no("Remove executables:\n" \ "\t#{executables.join ", "}\n\n" \ "in addition to the gem?", true) else @force_executables end if remove bin_dir = @bin_dir || Gem.bindir(spec.base_dir) raise Gem::FilePermissionError, bin_dir unless File.writable? bin_dir executables.each do |exe_name| say "Removing #{exe_name}" exe_file = File.join bin_dir, exe_name safe_delete { FileUtils.rm exe_file } safe_delete { FileUtils.rm "#{exe_file}.bat" } end else say "Executables and scripts will remain installed." end end
Entfernt installierte ausführbare Dateien und Batch-Dateien (nur Windows) für spec.
Source
# File lib/rubygems/uninstaller.rb, line 386 def safe_delete(&block) block.call rescue Errno::ENOENT nil rescue Errno::EPERM e = Gem::UninstallError.new e.spec = @spec raise e end
Source
# File lib/rubygems/uninstaller.rb, line 94 def uninstall dependency = Gem::Dependency.new @gem, @version list = [] specification_record.stubs.each do |spec| next unless dependency.matches_spec? spec list << spec end if list.empty? raise Gem::InstallError, "gem #{@gem.inspect} is not installed" end default_specs, list = list.partition(&:default_gem?) warn_cannot_uninstall_default_gems(default_specs - list) @default_specs_matching_uninstall_params = default_specs.map(&:to_spec) list, other_repo_specs = list.partition do |spec| @gem_home == spec.base_dir || (@user_install && spec.base_dir == @user_dir) end list.sort! if list.empty? return unless other_repo_specs.any? other_repos = other_repo_specs.map(&:base_dir).uniq message = ["#{@gem} is not installed in GEM_HOME, try:"] message.concat other_repos.map {|repo| "\tgem uninstall -i #{repo} #{@gem}" } raise Gem::InstallError, message.join("\n") elsif @force_all remove_all list elsif list.size > 1 gem_names = list.map(&:full_name_with_location) gem_names << "All versions" say _, index = choose_from_list "Select gem to uninstall:", gem_names if index == list.size remove_all list elsif index && index >= 0 && index < list.size uninstall_gem list[index] else say "Error: must enter a number [1-#{list.size + 1}]" end else uninstall_gem list.first end end
Führt die Deinstallation des Gems durch. Dies entfernt die Spezifikation, das Gem-Verzeichnis und die zwischengespeicherte .gem-Datei.
Source
# File lib/rubygems/uninstaller.rb, line 156 def uninstall_gem(stub) spec = stub.to_spec @spec = spec unless dependencies_ok? spec if abort_on_dependent? || !ask_if_ok(spec) raise Gem::DependencyRemovalException, "Uninstallation aborted due to dependent gem(s)" end end Gem.pre_uninstall_hooks.each do |hook| hook.call self end remove_executables @spec remove_plugins @spec remove @spec specification_record.remove_spec(stub) regenerate_plugins Gem.post_uninstall_hooks.each do |hook| hook.call self end @spec = nil end
Deinstalliert das Gem spec
Private Instanzmethoden
Source
# File lib/rubygems/uninstaller.rb, line 409 def announce_deletion_of(spec) name = spec.full_name say "Successfully uninstalled #{name}" if default_spec_matches?(spec) say( "There was both a regular copy and a default copy of #{name}. The " \ "regular copy was successfully uninstalled, but the default copy " \ "was left around because default gems can't be removed." ) end end
Source
# File lib/rubygems/uninstaller.rb, line 422 def default_spec_matches?(spec) !default_specs_that_match(spec).empty? end
@return true, wenn die Spezifikationen von Standard-Gems gleich (`==`) der gegebenen `spec` sind.
Source
# File lib/rubygems/uninstaller.rb, line 427 def default_specs_that_match(spec) @default_specs_matching_uninstall_params.select {|default_spec| spec == default_spec } end
@return [Array] Spezifikationen von Standard-Gems, die gleich (`==`) der gegebenen `spec` sind.
Source
# File lib/rubygems/uninstaller.rb, line 437 def plugin_dir_for(spec) Gem.plugindir(spec.base_dir) end
Source
# File lib/rubygems/uninstaller.rb, line 399 def rm_r(path, exclusions:) FileUtils::Entry_.new(path).postorder_traverse do |ent| ent.remove unless exclusions.include?(ent.path) end end
Source
# File lib/rubygems/uninstaller.rb, line 405 def specification_record @specification_record ||= @install_dir ? Gem::SpecificationRecord.from_path(@install_dir) : Gem::Specification.specification_record end
Source
# File lib/rubygems/uninstaller.rb, line 431 def warn_cannot_uninstall_default_gems(specs) specs.each do |spec| say "Gem #{spec.full_name} cannot be uninstalled because it is a default gem" end end