Class: Gem::Commands::InstallCommand

Inherits:
Gem::Command show all
Includes:
InstallUpdateOptions, LocalRemoteOptions, VersionOption
Defined in:
lib/rubygems/commands/install_command.rb

Overview

Gem installer command line tool

See ‘gem help install`

Instance Attribute Summary collapse

Attributes inherited from Gem::Command

#command, #defaults, #options, #program_name, #summary

Instance Method Summary collapse

Methods included from InstallUpdateOptions

#add_install_update_options, #install_update_defaults_str

Methods included from LocalRemoteOptions

#accept_uri_http, #add_bulk_threshold_option, #add_clear_sources_option, #add_local_remote_options, #add_proxy_option, #add_source_option, #add_update_sources_option, #both?, #local?, #remote?

Methods included from VersionOption

#add_platform_option, #add_prerelease_option, #add_version_option

Methods inherited from Gem::Command

add_common_option, #add_extra_args, #add_option, add_specific_extra_args, #begins?, build_args, build_args=, common_options, extra_args, extra_args=, #get_all_gem_names, #get_all_gem_names_and_versions, #get_one_gem_name, #get_one_optional_argument, #handle_options, #handles?, #invoke, #invoke_with_build_args, #merge_options, #remove_option, #show_help, #show_lookup_failure, specific_extra_args, specific_extra_args_hash, #when_invoked

Methods included from UserInteraction

#alert, #alert_error, #alert_warning, #ask, #ask_for_password, #ask_yes_no, #choose_from_list, #say, #terminate_interaction

Methods included from DefaultUserInteraction

ui, #ui, ui=, #ui=, use_ui, #use_ui

Constructor Details

#initializeInstallCommand

Returns a new instance of InstallCommand.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/rubygems/commands/install_command.rb', line 23

def initialize
  defaults = Gem::DependencyInstaller::DEFAULT_OPTIONS.merge({
    :format_executable => false,
    :version           => Gem::Requirement.default,
  })

  super 'install', 'Install a gem into the local repository', defaults

  add_install_update_options
  add_local_remote_options
  add_platform_option
  add_version_option
  add_prerelease_option "to be installed. (Only for listed gems)"

  add_option(:"Install/Update", '-g', '--file FILE',
             'Read from a gem dependencies API file and',
             'install the listed gems') do |v,o|
    o[:gemdeps] = v
  end

  @installed_specs = nil
end

Instance Attribute Details

#installed_specsObject (readonly)

:nodoc:



17
18
19
# File 'lib/rubygems/commands/install_command.rb', line 17

def installed_specs
  @installed_specs
end

Instance Method Details

#argumentsObject

:nodoc:



46
47
48
# File 'lib/rubygems/commands/install_command.rb', line 46

def arguments # :nodoc:
  "GEMNAME       name of gem to install"
end

#defaults_strObject

:nodoc:



50
51
52
53
# File 'lib/rubygems/commands/install_command.rb', line 50

def defaults_str # :nodoc:
  "--both --version '#{Gem::Requirement.default}' --document --no-force\n" +
  "--install-dir #{Gem.dir}"
end

#descriptionObject

:nodoc:



55
56
57
58
59
60
61
62
63
64
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
104
105
106
# File 'lib/rubygems/commands/install_command.rb', line 55

def description # :nodoc:
  <<-EOF
The install command installs local or remote gem into a gem repository.

For gems with executables ruby installs a wrapper file into the executable
directory by default.  This can be overridden with the --no-wrappers option.
The wrapper allows you to choose among alternate gem versions using _version_.

For example `rake _0.7.3_ --version` will run rake version 0.7.3 if a newer
version is also installed.

If an extension fails to compile during gem installation the gem
specification is not written out, but the gem remains unpacked in the
repository.  You may need to specify the path to the library's headers and
libraries to continue.  You can do this by adding a -- between RubyGems'
options and the extension's build options:

$ gem install some_extension_gem
[build fails]
Gem files will remain installed in \\
/path/to/gems/some_extension_gem-1.0 for inspection.
Results logged to /path/to/gems/some_extension_gem-1.0/gem_make.out
$ gem install some_extension_gem -- --with-extension-lib=/path/to/lib
[build succeeds]
$ gem list some_extension_gem

*** LOCAL GEMS ***

some_extension_gem (1.0)
$

If you correct the compilation errors by editing the gem files you will need
to write the specification by hand.  For example:

$ gem install some_extension_gem
[build fails]
Gem files will remain installed in \\
/path/to/gems/some_extension_gem-1.0 for inspection.
Results logged to /path/to/gems/some_extension_gem-1.0/gem_make.out
$ [cd /path/to/gems/some_extension_gem-1.0]
$ [edit files or what-have-you and run make]
$ gem spec ../../cache/some_extension_gem-1.0.gem --ruby > \\
           ../../specifications/some_extension_gem-1.0.gemspec
$ gem list some_extension_gem

*** LOCAL GEMS ***

some_extension_gem (1.0)
$

  EOF
end

#executeObject



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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
192
193
194
195
# File 'lib/rubygems/commands/install_command.rb', line 134

def execute
  if gf = options[:gemdeps] then
    install_from_gemdeps gf
    return
  end

  @installed_specs = []

  ENV.delete 'GEM_PATH' if options[:install_dir].nil? and RUBY_VERSION > '1.9'

  if options[:install_dir] and options[:user_install]
    alert_error "Use --install-dir or --user-install but not both"
    terminate_interaction 1
  end

  exit_code = 0

  if options[:version] != Gem::Requirement.default &&
      get_all_gem_names.size > 1 then
    alert_error "Can't use --version w/ multiple gems. Use name:ver instead."
    terminate_interaction 1
  end


  get_all_gem_names_and_versions.each do |gem_name, gem_version|
    gem_version ||= options[:version]

    begin
      next if options[:conservative] and
        not Gem::Dependency.new(gem_name, gem_version).matching_specs.empty?

      inst = Gem::DependencyInstaller.new options
      inst.install gem_name, Gem::Requirement.create(gem_version)

      @installed_specs.push(*inst.installed_gems)

      next unless errs = inst.errors

      errs.each do |x|
        next unless Gem::SourceFetchProblem === x

        msg = "Unable to pull data from '#{x.source.uri}': #{x.error.message}"

        alert_warning msg
      end
    rescue Gem::InstallError => e
      alert_error "Error installing #{gem_name}:\n\t#{e.message}"
      exit_code |= 1
    rescue Gem::GemNotFoundException => e
      show_lookup_failure e.name, e.version, e.errors, options[:domain]

      exit_code |= 2
    end
  end

  unless @installed_specs.empty? then
    gems = @installed_specs.length == 1 ? 'gem' : 'gems'
    say "#{@installed_specs.length} #{gems} installed"
  end

  raise Gem::SystemExitException, exit_code
end

#install_from_gemdeps(gf) ⇒ Object



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/rubygems/commands/install_command.rb', line 112

def install_from_gemdeps(gf)
  require 'rubygems/request_set'
  rs = Gem::RequestSet.new
  rs.load_gemdeps gf

  rs.resolve

  specs = rs.install options do |req, inst|
    s = req.full_spec

    if inst
      say "Installing #{s.name} (#{s.version})"
    else
      say "Using #{s.name} (#{s.version})"
    end
  end

  @installed_specs = specs

  raise Gem::SystemExitException, 0
end

#usageObject

:nodoc:



108
109
110
# File 'lib/rubygems/commands/install_command.rb', line 108

def usage # :nodoc:
  "#{program_name} GEMNAME [GEMNAME ...] [options] -- --build-flags"
end