Class: Gem::DependencyInstaller
- Inherits:
-
Object
- Object
- Gem::DependencyInstaller
- Includes:
- UserInteraction
- Defined in:
- lib/rubygems/dependency_installer.rb
Overview
Installs a gem along with all its dependencies from local and remote gems.
Constant Summary collapse
- DEFAULT_OPTIONS =
:nodoc:
{ # :nodoc: env_shebang: false, document: %w[ri], domain: :both, # HACK: dup force: false, format_executable: false, # HACK: dup ignore_dependencies: false, prerelease: false, security_policy: nil, # HACK: NoSecurity requires OpenSSL. AlmostNo? Low? wrappers: true, build_args: nil, build_docs_in_background: false, }.freeze
Instance Attribute Summary collapse
-
#document ⇒ Object
readonly
Documentation types.
-
#errors ⇒ Object
readonly
Errors from SpecFetcher while searching for remote specifications.
-
#installed_gems ⇒ Object
readonly
List of gems installed by #install in alphabetic order.
Instance Method Summary collapse
-
#consider_local? ⇒ Boolean
Indicated, based on the requested domain, if local gems should be considered.
-
#consider_remote? ⇒ Boolean
Indicated, based on the requested domain, if remote gems should be considered.
-
#in_background(what) ⇒ Object
:nodoc:.
-
#initialize(options = {}) ⇒ DependencyInstaller
constructor
Creates a new installer instance.
-
#install(dep_or_name, version = Gem::Requirement.default) ⇒ Object
Installs the gem
dep_or_nameand all its dependencies. -
#install_development_deps ⇒ Object
:nodoc:.
-
#resolve_dependencies(dep_or_name, version) ⇒ Object
:nodoc:.
Methods included from UserInteraction
#alert, #alert_error, #alert_warning, #ask, #ask_for_password, #ask_yes_no, #choose_from_list, #say, #terminate_interaction, #verbose
Methods included from DefaultUserInteraction
ui, #ui, ui=, #ui=, use_ui, #use_ui
Methods included from Text
#clean_text, #format_text, #levenshtein_distance, #min3, #truncate_text
Constructor Details
#initialize(options = {}) ⇒ DependencyInstaller
Creates a new installer instance.
Options are:
- :cache_dir
-
Alternate repository path to store .gem files in.
- :domain
-
:local, :remote, or :both. :local only searches gems in the current directory. :remote searches only gems in Gem::sources. :both searches both.
- :env_shebang
-
See Gem::Installer::new.
- :force
-
See Gem::Installer#install.
- :format_executable
-
See Gem::Installer#initialize.
- :ignore_dependencies
-
Don’t install any dependencies.
- :install_dir
-
See Gem::Installer#install.
- :prerelease
-
Allow prerelease versions. See #install.
- :security_policy
-
See Gem::Installer::new and Gem::Security.
- :user_install
-
See Gem::Installer.new
- :wrappers
-
See Gem::Installer::new
- :build_args
-
See Gem::Installer::new
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/rubygems/dependency_installer.rb', line 65 def initialize( = {}) @only_install_dir = ![:install_dir].nil? @install_dir = [:install_dir] || Gem.dir @build_root = [:build_root] = DEFAULT_OPTIONS.merge @bin_dir = [:bin_dir] @dev_shallow = [:dev_shallow] @development = [:development] @document = [:document] @domain = [:domain] @env_shebang = [:env_shebang] @force = [:force] @format_executable = [:format_executable] @ignore_dependencies = [:ignore_dependencies] @prerelease = [:prerelease] @security_policy = [:security_policy] @user_install = [:user_install] @wrappers = [:wrappers] @build_args = [:build_args] @build_jobs = [:build_jobs] @build_docs_in_background = [:build_docs_in_background] @dir_mode = [:dir_mode] @data_mode = [:data_mode] @prog_mode = [:prog_mode] # Indicates that we should not try to update any deps unless # we absolutely must. @minimal_deps = [:minimal_deps] @available = nil @installed_gems = [] @toplevel_specs = nil @cache_dir = [:cache_dir] || @install_dir @errors = [] end |
Instance Attribute Details
#document ⇒ Object (readonly)
Documentation types. For use by the Gem.done_installing hook
34 35 36 |
# File 'lib/rubygems/dependency_installer.rb', line 34 def document @document end |
#errors ⇒ Object (readonly)
Errors from SpecFetcher while searching for remote specifications
39 40 41 |
# File 'lib/rubygems/dependency_installer.rb', line 39 def errors @errors end |
#installed_gems ⇒ Object (readonly)
List of gems installed by #install in alphabetic order
44 45 46 |
# File 'lib/rubygems/dependency_installer.rb', line 44 def installed_gems @installed_gems end |
Instance Method Details
#consider_local? ⇒ Boolean
Indicated, based on the requested domain, if local gems should be considered.
109 110 111 |
# File 'lib/rubygems/dependency_installer.rb', line 109 def consider_local? @domain == :both || @domain == :local end |
#consider_remote? ⇒ Boolean
Indicated, based on the requested domain, if remote gems should be considered.
117 118 119 |
# File 'lib/rubygems/dependency_installer.rb', line 117 def consider_remote? @domain == :both || @domain == :remote end |
#in_background(what) ⇒ Object
:nodoc:
121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/rubygems/dependency_installer.rb', line 121 def in_background(what) # :nodoc: fork_happened = false if @build_docs_in_background && Process.respond_to?(:fork) begin Process.fork do yield end fork_happened = true say "#{what} in a background process." rescue NotImplementedError end end yield unless fork_happened end |
#install(dep_or_name, version = Gem::Requirement.default) ⇒ Object
Installs the gem dep_or_name and all its dependencies. Returns an Array of installed gem specifications.
If the :prerelease option is set and there is a prerelease for dep_or_name the prerelease version will be installed.
Unless explicitly specified as a prerelease dependency, prerelease gems that dep_or_name depend on will not be installed.
If c-1.a depends on b-1 and a-1.a and there is a gem b-1.a available then c-1.a, b-1 and a-1.a will be installed. b-1.a will need to be installed separately.
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
# File 'lib/rubygems/dependency_installer.rb', line 150 def install(dep_or_name, version = Gem::Requirement.default) request_set = resolve_dependencies dep_or_name, version @installed_gems = [] = { bin_dir: @bin_dir, build_args: @build_args, build_jobs: @build_jobs, document: @document, env_shebang: @env_shebang, force: @force, format_executable: @format_executable, ignore_dependencies: @ignore_dependencies, prerelease: @prerelease, security_policy: @security_policy, user_install: @user_install, wrappers: @wrappers, build_root: @build_root, dir_mode: @dir_mode, data_mode: @data_mode, prog_mode: @prog_mode, } [:install_dir] = @install_dir if @only_install_dir request_set.install do |_, installer| @installed_gems << installer.spec if installer end @installed_gems.sort! # Since this is currently only called for docs, we can be lazy and just say # it's documentation. Ideally the hook adder could decide whether to be in # the background or not, and what to call it. in_background "Installing documentation" do Gem.done_installing_hooks.each do |hook| hook.call self, @installed_gems end end unless Gem.done_installing_hooks.empty? @installed_gems end |
#install_development_deps ⇒ Object
:nodoc:
193 194 195 196 197 198 199 200 201 |
# File 'lib/rubygems/dependency_installer.rb', line 193 def install_development_deps # :nodoc: if @development && @dev_shallow :shallow elsif @development :all else :none end end |
#resolve_dependencies(dep_or_name, version) ⇒ Object
:nodoc:
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 |
# File 'lib/rubygems/dependency_installer.rb', line 203 def resolve_dependencies(dep_or_name, version) # :nodoc: request_set = Gem::RequestSet.new request_set.development = @development request_set.development_shallow = @dev_shallow request_set.soft_missing = @force request_set.prerelease = @prerelease installer_set = Gem::Resolver::InstallerSet.new @domain installer_set.ignore_installed = (@minimal_deps == false) || @only_install_dir installer_set.force = @force if consider_local? if dep_or_name =~ /\.gem$/ && File.file?(dep_or_name) src = Gem::Source::SpecificFile.new dep_or_name installer_set.add_local dep_or_name, src.spec, src version = src.spec.version if version == Gem::Requirement.default elsif dep_or_name =~ /\.gem$/ # rubocop:disable Performance/RegexpMatch Dir[dep_or_name].each do |name| src = Gem::Source::SpecificFile.new name installer_set.add_local dep_or_name, src.spec, src rescue Gem::Package::FormatError end # else This is a dependency. InstallerSet handles this case end end dependency = if spec = installer_set.local?(dep_or_name) installer_set.remote = nil if spec.dependencies.none? Gem::Dependency.new spec.name, version elsif String === dep_or_name Gem::Dependency.new dep_or_name, version else dep_or_name end dependency.prerelease = @prerelease request_set.import [dependency] installer_set.add_always_install dependency request_set.always_install = installer_set.always_install request_set.remote = installer_set.consider_remote? if @ignore_dependencies installer_set.ignore_dependencies = true request_set.ignore_dependencies = true request_set.soft_missing = true end request_set.resolve installer_set @errors.concat request_set.errors request_set end |