Class | Gem::Commands::SetupCommand |
In: |
lib/rubygems/commands/setup_command.rb
|
Parent: | Gem::Command |
Installs RubyGems itself. This command is ordinarily only available from a RubyGems checkout or tarball.
# File lib/rubygems/commands/setup_command.rb, line 12 12: def initialize 13: super 'setup', 'Install RubyGems', 14: :format_executable => true, :rdoc => true, :ri => true, 15: :site_or_vendor => :sitelibdir, 16: :destdir => '', :prefix => '' 17: 18: add_option '--prefix=PREFIX', 19: 'Prefix path for installing RubyGems', 20: 'Will not affect gem repository location' do |prefix, options| 21: options[:prefix] = File.expand_path prefix 22: end 23: 24: add_option '--destdir=DESTDIR', 25: 'Root directory to install RubyGems into', 26: 'Mainly used for packaging RubyGems' do |destdir, options| 27: options[:destdir] = File.expand_path destdir 28: end 29: 30: add_option '--[no-]vendor', 31: 'Install into vendorlibdir not sitelibdir', 32: '(Requires Ruby 1.8.7)' do |vendor, options| 33: if vendor and Gem.ruby_version < Gem::Version.new('1.8.7') then 34: raise OptionParser::InvalidOption, 35: "requires ruby 1.8.7+ (you have #{Gem.ruby_version})" 36: end 37: 38: options[:site_or_vendor] = vendor ? :vendorlibdir : :sitelibdir 39: end 40: 41: add_option '--[no-]format-executable', 42: 'Makes `gem` match ruby', 43: 'If ruby is ruby18, gem will be gem18' do |value, options| 44: options[:format_executable] = value 45: end 46: 47: add_option '--[no-]rdoc', 48: 'Generate RDoc documentation for RubyGems' do |value, options| 49: options[:rdoc] = value 50: end 51: 52: add_option '--[no-]ri', 53: 'Generate RI documentation for RubyGems' do |value, options| 54: options[:ri] = value 55: end 56: end
# File lib/rubygems/commands/setup_command.rb, line 58 58: def check_ruby_version 59: required_version = Gem::Requirement.new '>= 1.8.6' 60: 61: unless required_version.satisfied_by? Gem.ruby_version then 62: alert_error "Expected Ruby version #{required_version}, is #{Gem.ruby_version}" 63: terminate_interaction 1 64: end 65: end
# File lib/rubygems/commands/setup_command.rb, line 90 90: def execute 91: @verbose = Gem.configuration.really_verbose 92: 93: install_destdir = options[:destdir] 94: 95: unless install_destdir.empty? then 96: ENV['GEM_HOME'] ||= File.join(install_destdir, 97: Gem.default_dir.gsub(/^[a-zA-Z]:/, '')) 98: end 99: 100: check_ruby_version 101: 102: if Gem.configuration.really_verbose then 103: extend FileUtils::Verbose 104: else 105: extend FileUtils 106: end 107: 108: lib_dir, bin_dir = make_destination_dirs install_destdir 109: 110: install_lib lib_dir 111: 112: install_executables bin_dir 113: 114: remove_old_bin_files bin_dir 115: 116: remove_source_caches install_destdir 117: 118: say "RubyGems #{Gem::VERSION} installed" 119: 120: uninstall_old_gemcutter 121: 122: install_rdoc 123: 124: say 125: if @verbose then 126: say "-" * 78 127: say 128: end 129: 130: release_notes = File.join Dir.pwd, 'History.txt' 131: 132: release_notes = if File.exist? release_notes then 133: open release_notes do |io| 134: text = io.gets '===' 135: text << io.gets('===') 136: text[0...-3] 137: end 138: else 139: "Oh-no! Unable to find release notes!" 140: end 141: 142: say release_notes 143: 144: say 145: say "-" * 78 146: say 147: 148: say "RubyGems installed the following executables:" 149: say @bin_file_names.map { |name| "\t#{name}\n" } 150: say 151: 152: unless @bin_file_names.grep(/#{File::SEPARATOR}gem$/) then 153: say "If `gem` was installed by a previous RubyGems installation, you may need" 154: say "to remove it by hand." 155: say 156: end 157: end
# File lib/rubygems/commands/setup_command.rb, line 159 159: def install_executables(bin_dir) 160: say "Installing gem executable" if @verbose 161: 162: @bin_file_names = [] 163: 164: Dir.chdir 'bin' do 165: bin_files = Dir['*'] 166: 167: bin_files.delete 'update_rubygems' 168: 169: bin_files.each do |bin_file| 170: bin_file_formatted = if options[:format_executable] then 171: Gem.default_exec_format % bin_file 172: else 173: bin_file 174: end 175: 176: dest_file = File.join bin_dir, bin_file_formatted 177: bin_tmp_file = File.join Dir.tmpdir, bin_file 178: 179: begin 180: bin = File.readlines bin_file 181: bin[0] = "#!#{Gem.ruby}\n" 182: 183: File.open bin_tmp_file, 'w' do |fp| 184: fp.puts bin.join 185: end 186: 187: install bin_tmp_file, dest_file, :mode => 0755 188: @bin_file_names << dest_file 189: ensure 190: rm bin_tmp_file 191: end 192: 193: next unless Gem.win_platform? 194: 195: begin 196: bin_cmd_file = File.join Dir.tmpdir, "#{bin_file}.bat" 197: 198: File.open bin_cmd_file, 'w' do |file| 199: file.puts "@ECHO OFF\nIF NOT \"%~f0\" == \"~f0\" GOTO :WinNT\n@\"\#{File.basename(Gem.ruby).chomp('\"')}\" \"\#{dest_file}\" %1 %2 %3 %4 %5 %6 %7 %8 %9\nGOTO :EOF\n:WinNT\n@\"\#{File.basename(Gem.ruby).chomp('\"')}\" \"%~dpn0\" %*\n" 200: end 201: 202: install bin_cmd_file, "#{dest_file}.bat", :mode => 0755 203: ensure 204: rm bin_cmd_file 205: end 206: end 207: end 208: end
# File lib/rubygems/commands/setup_command.rb, line 218 218: def install_lib(lib_dir) 219: say "Installing RubyGems" if @verbose 220: 221: Dir.chdir 'lib' do 222: lib_files = Dir[File.join('**', '*rb')] 223: 224: lib_files.each do |lib_file| 225: dest_file = File.join lib_dir, lib_file 226: dest_dir = File.dirname dest_file 227: mkdir_p dest_dir unless File.directory? dest_dir 228: 229: install lib_file, dest_file, :mode => 0644 230: end 231: end 232: end
# File lib/rubygems/commands/setup_command.rb, line 234 234: def install_rdoc 235: gem_doc_dir = File.join Gem.dir, 'doc' 236: rubygems_name = "rubygems-#{Gem::VERSION}" 237: rubygems_doc_dir = File.join gem_doc_dir, rubygems_name 238: 239: if File.writable? gem_doc_dir and 240: (not File.exist? rubygems_doc_dir or 241: File.writable? rubygems_doc_dir) then 242: say "Removing old RubyGems RDoc and ri" if @verbose 243: Dir[File.join(Gem.dir, 'doc', 'rubygems-[0-9]*')].each do |dir| 244: rm_rf dir 245: end 246: 247: if options[:ri] then 248: ri_dir = File.join rubygems_doc_dir, 'ri' 249: say "Installing #{rubygems_name} ri into #{ri_dir}" if @verbose 250: run_rdoc '--ri', '--op', ri_dir 251: end 252: 253: if options[:rdoc] then 254: rdoc_dir = File.join rubygems_doc_dir, 'rdoc' 255: say "Installing #{rubygems_name} rdoc into #{rdoc_dir}" if @verbose 256: run_rdoc '--op', rdoc_dir 257: end 258: elsif @verbose then 259: say "Skipping RDoc generation, #{gem_doc_dir} not writable" 260: say "Set the GEM_HOME environment variable if you want RDoc generated" 261: end 262: end
# File lib/rubygems/commands/setup_command.rb, line 264 264: def make_destination_dirs(install_destdir) 265: lib_dir = nil 266: bin_dir = nil 267: 268: prefix = options[:prefix] 269: site_or_vendor = options[:site_or_vendor] 270: 271: if prefix.empty? then 272: lib_dir = Gem::ConfigMap[site_or_vendor] 273: bin_dir = Gem::ConfigMap[:bindir] 274: else 275: # Apple installed RubyGems into libdir, and RubyGems <= 1.1.0 gets 276: # confused about installation location, so switch back to 277: # sitelibdir/vendorlibdir. 278: if defined?(APPLE_GEM_HOME) and 279: # just in case Apple and RubyGems don't get this patched up proper. 280: (prefix == Gem::ConfigMap[:libdir] or 281: # this one is important 282: prefix == File.join(Gem::ConfigMap[:libdir], 'ruby')) then 283: lib_dir = Gem::ConfigMap[site_or_vendor] 284: bin_dir = Gem::ConfigMap[:bindir] 285: else 286: lib_dir = File.join prefix, 'lib' 287: bin_dir = File.join prefix, 'bin' 288: end 289: end 290: 291: unless install_destdir.empty? then 292: lib_dir = File.join install_destdir, lib_dir.gsub(/^[a-zA-Z]:/, '') 293: bin_dir = File.join install_destdir, bin_dir.gsub(/^[a-zA-Z]:/, '') 294: end 295: 296: mkdir_p lib_dir 297: mkdir_p bin_dir 298: 299: return lib_dir, bin_dir 300: end
# File lib/rubygems/commands/setup_command.rb, line 302 302: def remove_old_bin_files(bin_dir) 303: old_bin_files = { 304: 'gem_mirror' => 'gem mirror', 305: 'gem_server' => 'gem server', 306: 'gemlock' => 'gem lock', 307: 'gemri' => 'ri', 308: 'gemwhich' => 'gem which', 309: 'index_gem_repository.rb' => 'gem generate_index', 310: } 311: 312: old_bin_files.each do |old_bin_file, new_name| 313: old_bin_path = File.join bin_dir, old_bin_file 314: next unless File.exist? old_bin_path 315: 316: deprecation_message = "`#{old_bin_file}` has been deprecated. Use `#{new_name}` instead." 317: 318: File.open old_bin_path, 'w' do |fp| 319: fp.write "#!\#{Gem.ruby}\n\nabort \"\#{deprecation_message}\"\n" 320: end 321: 322: next unless Gem.win_platform? 323: 324: File.open "#{old_bin_path}.bat", 'w' do |fp| 325: fp.puts %{@ECHO.#{deprecation_message}} 326: end 327: end 328: end
# File lib/rubygems/commands/setup_command.rb, line 335 335: def remove_source_caches(install_destdir) 336: if install_destdir.empty? 337: require 'rubygems/source_info_cache' 338: 339: user_cache_file = File.join(install_destdir, 340: Gem::SourceInfoCache.user_cache_file) 341: system_cache_file = File.join(install_destdir, 342: Gem::SourceInfoCache.system_cache_file) 343: 344: say "Removing old source_cache files" if Gem.configuration.really_verbose 345: rm_f user_cache_file if File.writable? File.dirname(user_cache_file) 346: rm_f system_cache_file if File.writable? File.dirname(system_cache_file) 347: end 348: end
# File lib/rubygems/commands/setup_command.rb, line 350 350: def run_rdoc(*args) 351: begin 352: gem 'rdoc' 353: rescue Gem::LoadError 354: end 355: 356: require 'rdoc/rdoc' 357: 358: args << '--quiet' 359: args << '--main' << 'README' 360: args << '.' << 'README' << 'LICENSE.txt' << 'GPL.txt' 361: 362: r = RDoc::RDoc.new 363: r.document args 364: end