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.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/rubygems/commands/install_command.rb', line 21

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

  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|
    v = Gem::GEM_DEP_FILES.find do |file|
      File.exist? file
    end unless v

    unless v then
      message = v ? v : "(tried #{Gem::GEM_DEP_FILES.join ', '})"

      raise OptionParser::InvalidArgument,
              "cannot find gem dependencies file #{message}"
    end

    o[:gemdeps] = v
  end

  add_option(:"Install/Update", '--without GROUPS', Array,
             'Omit the named groups (comma separated)',
             'when installing from a gem dependencies',
             'file') do |v,o|
    o[:without_groups].concat v.map { |without| without.intern }
  end

  add_option(:"Install/Update", '--default',
             'Add the gem\'s full specification to',
             'specifications/default and extract only its bin') do |v,o|
    o[:install_as_default] = v
  end

  add_option(:"Install/Update", '--explain',
             'Rather than install the gems, indicate which would',
             'be installed') do |v,o|
    o[:explain] = v
  end

  @installed_specs = []
end

Instance Attribute Details

#installed_specsObject (readonly)

:nodoc:



15
16
17
# File 'lib/rubygems/commands/install_command.rb', line 15

def installed_specs
  @installed_specs
end

Instance Method Details

#argumentsObject

:nodoc:



75
76
77
# File 'lib/rubygems/commands/install_command.rb', line 75

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

#check_install_dirObject

:nodoc:



141
142
143
144
145
146
# File 'lib/rubygems/commands/install_command.rb', line 141

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

#check_versionObject

:nodoc:



148
149
150
151
152
153
154
# File 'lib/rubygems/commands/install_command.rb', line 148

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

#defaults_strObject

:nodoc:



79
80
81
82
# File 'lib/rubygems/commands/install_command.rb', line 79

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

#descriptionObject

:nodoc:



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/rubygems/commands/install_command.rb', line 84

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



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/rubygems/commands/install_command.rb', line 156

def execute
  if options.include? :gemdeps then
    install_from_gemdeps
    return # not reached
  end

  @installed_specs = []

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

  check_install_dir
  check_version

  load_hooks

  exit_code = install_gems

  show_installed

  terminate_interaction exit_code
end

#install_from_gemdepsObject

:nodoc:



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 178

def install_from_gemdeps # :nodoc:
  require 'rubygems/request_set'
  rs = Gem::RequestSet.new

  specs = rs.install_from_gemdeps 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

  terminate_interaction
end

#install_gem(name, version) ⇒ Object

:nodoc:



197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'lib/rubygems/commands/install_command.rb', line 197

def install_gem name, version # :nodoc:
  return if options[:conservative] and
    not Gem::Dependency.new(name, version).matching_specs.empty?

  req = Gem::Requirement.create(version)

  if options[:ignore_dependencies] then
    install_gem_without_dependencies name, req
  else
    inst = Gem::DependencyInstaller.new options

    if options[:explain]
      request_set = inst.resolve_dependencies name, req

      puts "Gems to install:"

      request_set.specs.map { |s| s.full_name }.sort.each do |s|
        puts "  #{s}"
      end

      return
    else
      inst.install name, req
    end

    @installed_specs.push(*inst.installed_gems)

    show_install_errors inst.errors
  end
end

#install_gem_without_dependencies(name, req) ⇒ Object

:nodoc:



228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/rubygems/commands/install_command.rb', line 228

def install_gem_without_dependencies name, req # :nodoc:
  gem = nil

  if remote? then
    dependency = Gem::Dependency.new name, req
    dependency.prerelease = options[:prerelease]

    fetcher = Gem::RemoteFetcher.fetcher
    gem = fetcher.download_to_cache dependency
  end

  if local? and not gem then
    source = Gem::Source::Local.new
    spec = source.find_gem name, req

    gem = source.download spec
  end

  inst = Gem::Installer.new gem, options
  inst.install

  @installed_specs.push(inst.spec)
end

#install_gemsObject

:nodoc:



252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
# File 'lib/rubygems/commands/install_command.rb', line 252

def install_gems # :nodoc:
  exit_code = 0

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

    begin
      install_gem gem_name, gem_version
    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

  exit_code
end

#load_hooksObject

Loads post-install hooks



276
277
278
279
280
281
282
283
# File 'lib/rubygems/commands/install_command.rb', line 276

def load_hooks # :nodoc:
  if options[:install_as_default]
    require 'rubygems/install_default_message'
  else
    require 'rubygems/install_message'
  end
  require 'rubygems/rdoc'
end

#show_install_errors(errors) ⇒ Object

:nodoc:



285
286
287
288
289
290
291
292
293
294
295
# File 'lib/rubygems/commands/install_command.rb', line 285

def show_install_errors errors # :nodoc:
  return unless errors

  errors.each do |x|
    return unless Gem::SourceFetchProblem === x

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

    alert_warning msg
  end
end

#show_installedObject

:nodoc:



297
298
299
300
301
302
# File 'lib/rubygems/commands/install_command.rb', line 297

def show_installed # :nodoc:
  return if @installed_specs.empty?

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

#usageObject

:nodoc:



137
138
139
# File 'lib/rubygems/commands/install_command.rb', line 137

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