In Files

  • rubygems/dependency_installer.rb

Class/Module Index [+]



Installs a gem along with all its dependencies from local and remote gems.



Documentation types. For use by the Gem.done_installing hook


Errors from SpecFetcher while searching for remote specifications


List of gems installed by install in alphabetic order

Public Class Methods

new(options = {}) click to toggle source

Creates a new installer instance.

Options are:


Alternate repository path to store .gem files in.


:local, :remote, or :both. :local only searches gems in the current directory. :remote searches only gems in Gem.sources. :both searches both.




See Gem::Installer#install.


See Gem::Installer#initialize.


Don’t install any dependencies.


See Gem::Installer#install.


Allow prerelease versions. See install.


See and Gem::Security.







               # File rubygems/dependency_installer.rb, line 72
def initialize options = {}
  @only_install_dir = !!options[:install_dir]
  @install_dir = options[:install_dir] || Gem.dir

  options = DEFAULT_OPTIONS.merge options

  @bin_dir             = options[:bin_dir]
  @dev_shallow         = options[:dev_shallow]
  @development         = options[:development]
  @document            = options[:document]
  @domain              = options[:domain]
  @env_shebang         = options[:env_shebang]
  @force               = options[:force]
  @format_executable   = options[:format_executable]
  @ignore_dependencies = options[:ignore_dependencies]
  @prerelease          = options[:prerelease]
  @security_policy     = options[:security_policy]
  @user_install        = options[:user_install]
  @wrappers            = options[:wrappers]
  @build_args          = options[:build_args]
  @build_docs_in_background = options[:build_docs_in_background]
  @install_as_default  = options[:install_as_default]

  # Indicates that we should not try to update any deps unless
  # we absolutely must.
  @minimal_deps        = options[:minimal_deps]

  @available      = nil
  @installed_gems = []
  @toplevel_specs = nil

  @cache_dir = options[:cache_dir] || @install_dir

  @errors = nil

Public Instance Methods

consider_local?() click to toggle source

Indicated, based on the requested domain, if local gems should be considered.

               # File rubygems/dependency_installer.rb, line 180
def consider_local?
  @domain == :both or @domain == :local
consider_remote?() click to toggle source

Indicated, based on the requested domain, if remote gems should be considered.

               # File rubygems/dependency_installer.rb, line 188
def consider_remote?
  @domain == :both or @domain == :remote
find_spec_by_name_and_version(gem_name, version = Gem::Requirement.default, prerelease = false) click to toggle source

Finds a spec and the source_uri it came from for gem gem_name and version. Returns an Array of specs and sources required for installation of the gem.

               # File rubygems/dependency_installer.rb, line 262
def find_spec_by_name_and_version gem_name,
                                  version = Gem::Requirement.default,
                                  prerelease = false
  set =

  if consider_local?
    if gem_name =~ /\.gem$/ and File.file? gem_name then
      src =
      set.add src.spec, src
    elsif gem_name =~ /\.gem$/ then
      Dir[gem_name].each do |name|
          src = name
          set.add src.spec, src
        rescue Gem::Package::FormatError
      local =

      if s = local.find_gem(gem_name, version)
        set.add s, local

  if set.empty?
    dep = gem_name, version
    dep.prerelease = true if prerelease

    set = find_gems_with_sources(dep, true)

  if set.empty?
    raise, version, @errors)

  @available = set
install(dep_or_name, version = Gem::Requirement.default) click to toggle source

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.

               # File rubygems/dependency_installer.rb, line 370
def install dep_or_name, version = Gem::Requirement.default
  request_set = resolve_dependencies dep_or_name, version

  @installed_gems = []

  options = {
    :bin_dir             => @bin_dir,
    :build_args          => @build_args,
    :env_shebang         => @env_shebang,
    :force               => @force,
    :format_executable   => @format_executable,
    :ignore_dependencies => @ignore_dependencies,
    :security_policy     => @security_policy,
    :user_install        => @user_install,
    :wrappers            => @wrappers,
    :install_as_default  => @install_as_default
  options[:install_dir] = @install_dir if @only_install_dir

  request_set.install options do |_, installer|
    @installed_gems << installer.spec if installer


  # 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| self, @installed_gems
  end unless Gem.done_installing_hooks.empty?


Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit

blog comments powered by Disqus