1. Gem::
  2. Commands::
  3. SetupCommand

class Gem::Commands::SetupCommand

Installs RubyGems itself. This command is ordinarily only available from a RubyGems checkout or tarball.

Constants

ENV_PATHS
HISTORY_HEADER
VERSION_MATCHER

Public Class Methods

Source
# File lib/rubygems/commands/setup_command.rb, line 15definitializesuper"setup","Install RubyGems",format_executable:false,document:%w[ri],force:true,site_or_vendor:"sitelibdir",destdir:"",prefix:"",previous_version:"",regenerate_binstubs:true,regenerate_plugins:trueadd_option"--previous-version=VERSION","Previous version of RubyGems","Used for changelog processing"do|version,options|options[:previous_version] =versionendadd_option"--prefix=PREFIX","Prefix path for installing RubyGems","Will not affect gem repository location"do|prefix,options|options[:prefix] =File.expand_pathprefixendadd_option"--destdir=DESTDIR","Root directory to install RubyGems into","Mainly used for packaging RubyGems"do|destdir,options|options[:destdir] =File.expand_pathdestdirendadd_option"--[no-]vendor","Install into vendorlibdir not sitelibdir"do|vendor,options|options[:site_or_vendor] =vendor?"vendorlibdir":"sitelibdir"endadd_option"--[no-]format-executable","Makes `gem` match ruby","If Ruby is ruby18, gem will be gem18"do|value,options|options[:format_executable] =valueendadd_option"--[no-]document [TYPES]",Array,"Generate documentation for RubyGems","List the documentation types you wish to","generate.  For example: rdoc,ri"do|value,options|options[:document] =casevaluewhennilthen%w[rdoc ri]whenfalsethen []elsevalueendendadd_option"--[no-]rdoc","Generate RDoc documentation for RubyGems"do|value,options|ifvalueoptions[:document]<<"rdoc"elseoptions[:document].delete"rdoc"endoptions[:document].uniq!endadd_option"--[no-]ri","Generate RI documentation for RubyGems"do|value,options|ifvalueoptions[:document]<<"ri"elseoptions[:document].delete"ri"endoptions[:document].uniq!endadd_option"--[no-]regenerate-binstubs","Regenerate gem binstubs"do|value,options|options[:regenerate_binstubs] =valueendadd_option"--[no-]regenerate-plugins","Regenerate gem plugins"do|value,options|options[:regenerate_plugins] =valueendadd_option"-f","--[no-]force","Forcefully overwrite binstubs"do|value,options|options[:force] =valueendadd_option("-E","--[no-]env-shebang","Rewrite executables with a shebang","of /usr/bin/env")do|value,options|options[:env_shebang] =valueend@verbose =nilend
Calls superclass methodGem::Command::new

Public Instance Methods

Source
# File lib/rubygems/commands/setup_command.rb, line 662defbin_file_names@bin_file_names||= []end
Source
# File lib/rubygems/commands/setup_command.rb, line 607defdefault_dirprefix =options[:prefix]ifprefix.empty?dir =Gem.default_direlsedir =prefixendprepend_destdir_if_present(dir)end
Source
# File lib/rubygems/commands/setup_command.rb, line 139defexecute@verbose =Gem.configuration.really_verboserequire"fileutils"ifGem.configuration.really_verboseextendFileUtils::VerboseelseextendFileUtilsendextendMakeDirslib_dir,bin_dir =make_destination_dirsman_dir =generate_default_man_dirinstall_liblib_dirinstall_executablesbin_dirremove_old_bin_filesbin_dirremove_old_lib_fileslib_dir# Can be removed one we drop support for bundler 2.2.3 (the last version installing man files to man_dir)remove_old_man_filesman_dirifman_dir&&File.exist?(man_dir)install_default_bundler_gembin_dirifmode =options[:dir_mode]@mkdirs.uniq!File.chmod(mode,@mkdirs)endsay"RubyGems #{Gem::VERSION} installed"regenerate_binstubs(bin_dir)ifoptions[:regenerate_binstubs]regenerate_plugins(bin_dir)ifoptions[:regenerate_plugins]uninstall_old_gemcutterdocumentation_success =install_rdocsayif@verbosesay"-"*78sayendifoptions[:previous_version].empty?options[:previous_version] =Gem::VERSION.sub(/[0-9]+$/,"0")endoptions[:previous_version] =Gem::Version.new(options[:previous_version])show_release_notessaysay"-"*78saysay"RubyGems installed the following executables:"saybin_file_names.map {|name|"\t#{name}\n" }sayunlessbin_file_names.grep(/#{File::SEPARATOR}gem$/)say"If `gem` was installed by a previous RubyGems installation, you may need"say"to remove it by hand."sayendifdocumentation_successifoptions[:document].include?"rdoc"say"Rdoc documentation was installed. You may now invoke:"say"  gem server"say"and then peruse beautifully formatted documentation for your gems"say"with your web browser."say"If you do not wish to install this documentation in the future, use the"say"--no-document flag, or set it as the default in your ~/.gemrc file. See"say"'gem help env' for details."sayendifoptions[:document].include?"ri"say"Ruby Interactive (ri) documentation was installed. ri is kind of like man "say"pages for Ruby libraries. You may access it like this:"say"  ri Classname"say"  ri Classname.class_method"say"  ri Classname#instance_method"say"If you do not wish to install this documentation in the future, use the"say"--no-document flag, or set it as the default in your ~/.gemrc file. See"say"'gem help env' for details."sayendendend
Source
# File lib/rubygems/commands/setup_command.rb, line 459deffiles_in(dir)Dir.chdirdirdoDir.glob(File.join("**","*"),File::FNM_DOTMATCH).select {|f|!File.directory?(f) }endend
Source
# File lib/rubygems/commands/setup_command.rb, line 444defgenerate_default_dirsprefix =options[:prefix]site_or_vendor =options[:site_or_vendor]ifprefix.empty?lib_dir =RbConfig::CONFIG[site_or_vendor]bin_dir =RbConfig::CONFIG["bindir"]elselib_dir =File.joinprefix,"lib"bin_dir =File.joinprefix,"bin"end  [prepend_destdir_if_present(lib_dir),prepend_destdir_if_present(bin_dir)]end
Source
# File lib/rubygems/commands/setup_command.rb, line 431defgenerate_default_man_dirprefix =options[:prefix]ifprefix.empty?man_dir =RbConfig::CONFIG["mandir"]returnunlessman_direlseman_dir =File.joinprefix,"man"endprepend_destdir_if_present(man_dir)end
Source
# File lib/rubygems/commands/setup_command.rb, line 350definstall_default_bundler_gem(bin_dir)current_default_spec =Gem::Specification.default_stubs.find {|s|s.name=="bundler" }specs_dir =ifcurrent_default_spec&&default_dir==Gem.default_dirall_specs_current_version =Gem::Specification.stubs.select {|s|s.full_name==current_default_spec.full_name }Gem::Specification.remove_speccurrent_default_specloaded_from =current_default_spec.loaded_fromFile.delete(loaded_from)# Remove previous default gem executables if they were not shadowed by a regular gemFileUtils.rm_rfcurrent_default_spec.full_gem_pathifall_specs_current_version.size==1File.dirname(loaded_from)elsetarget_specs_dir =File.join(default_dir,"specifications","default")mkdir_ptarget_specs_dir,mode:0o755target_specs_direndnew_bundler_spec =Dir.chdir("bundler") {Gem::Specification.load("bundler.gemspec") }full_name =new_bundler_spec.full_namegemspec_path ="#{full_name}.gemspec"default_spec_path =File.join(specs_dir,gemspec_path)Gem.write_binary(default_spec_path,new_bundler_spec.to_ruby)bundler_spec =Gem::Specification.load(default_spec_path)# Remove gemspec that was same version of vendored bundler.normal_gemspec =File.join(default_dir,"specifications",gemspec_path)ifFile.file?normal_gemspecFile.deletenormal_gemspecend# Remove gem files that were same version of vendored bundler.ifFile.directory?bundler_spec.gems_dirDir.entries(bundler_spec.gems_dir).select {|default_gem|File.basename(default_gem)==full_name }.each {|default_gem|rm_rFile.join(bundler_spec.gems_dir,default_gem) }endrequire_relative"../installer"Dir.chdir("bundler")dobuilt_gem =Gem::Package.build(new_bundler_spec)begininstaller =Gem::Installer.at(built_gem,env_shebang:options[:env_shebang],format_executable:options[:format_executable],force:options[:force],bin_dir:bin_dir,install_dir:default_dir,wrappers:true      )installer.installFile.deleteinstaller.spec_fileinstaller.write_default_specensureFileUtils.rm_fbuilt_gemendendnew_bundler_spec.executables.each {|executable|bin_file_names<<target_bin_path(bin_dir,executable) }say"Bundler #{new_bundler_spec.version} installed"end
Source
# File lib/rubygems/commands/setup_command.rb, line 234definstall_executables(bin_dir)prog_mode =options[:prog_mode]||0o755executables = {"gem"=>"exe" }executables.eachdo|tool,path|say"Installing #{tool} executable"if@verboseDir.chdirpathdobin_file ="gem"require"tmpdir"dest_file =target_bin_path(bin_dir,bin_file)bin_tmp_file =File.joinDir.tmpdir,"#{bin_file}.#{$$}"beginbin =File.readlinesbin_filebin[0] =shebangFile.openbin_tmp_file,"w"do|fp|fp.putsbin.joinendinstallbin_tmp_file,dest_file,mode:prog_modebin_file_names<<dest_fileensurermbin_tmp_fileendnextunlessGem.win_platform?beginbin_cmd_file =File.joinDir.tmpdir,"#{bin_file}.bat"File.openbin_cmd_file,"w"do|file|file.puts<<-TEXT  @ECHO OFF  @"%~dp0#{File.basename(Gem.ruby).chomp('"')}" "%~dpn0" %*  TEXTendinstallbin_cmd_file,"#{dest_file}.bat",mode:prog_modeensurermbin_cmd_fileendendendend
Source
# File lib/rubygems/commands/setup_command.rb, line 632definstall_file(file,dest_dir)dest_file =File.joindest_dir,filedest_dir =File.dirnamedest_fileunlessFile.directory?dest_dirmkdir_pdest_dir,mode:0o755endinstallfile,dest_file,mode:options[:data_mode]||0o644end
Source
# File lib/rubygems/commands/setup_command.rb, line 626definstall_file_list(files,dest_dir)files.eachdo|file|install_filefile,dest_direndend
Source
# File lib/rubygems/commands/setup_command.rb, line 293definstall_lib(lib_dir)libs = {"RubyGems"=>"lib" }libs["Bundler"] ="bundler/lib"libs.eachdo|tool,path|say"Installing #{tool}"if@verboselib_files =files_inpathDir.chdirpathdoinstall_file_list(lib_files,lib_dir)endendend
Source
# File lib/rubygems/commands/setup_command.rb, line 307definstall_rdocgem_doc_dir =File.joinGem.dir,"doc"rubygems_name ="rubygems-#{Gem::VERSION}"rubygems_doc_dir =File.joingem_doc_dir,rubygems_namebeginGem.ensure_gem_subdirectoriesGem.dirrescueSystemCallError# ignoreendifFile.writable?(gem_doc_dir)&&     (!File.exist?(rubygems_doc_dir)||File.writable?(rubygems_doc_dir))say"Removing old RubyGems RDoc and ri"if@verboseDir[File.join(Gem.dir,"doc","rubygems-[0-9]*")].eachdo|dir|rm_rfdirendrequire_relative"../rdoc"returnfalseunlessdefined?(Gem::RDoc)fake_spec =Gem::Specification.new"rubygems",Gem::VERSIONdeffake_spec.full_gem_pathFile.expand_path"../../..",__dir__endgenerate_ri   =options[:document].include?"ri"generate_rdoc =options[:document].include?"rdoc"rdoc =Gem::RDoc.newfake_spec,generate_rdoc,generate_rirdoc.generatereturntrueelsif@verbosesay"Skipping RDoc generation, #{gem_doc_dir} not writable"say"Set the GEM_HOME environment variable if you want RDoc generated"endfalseend
Source
# File lib/rubygems/commands/setup_command.rb, line 418defmake_destination_dirslib_dir,bin_dir =Gem.default_rubygems_dirsunlesslib_dirlib_dir,bin_dir =generate_default_dirsendmkdir_plib_dir,mode:0o755mkdir_pbin_dir,mode:0o755  [lib_dir,bin_dir]end
Source
# File lib/rubygems/commands/setup_command.rb, line 619defprepend_destdir_if_present(path)destdir =options[:destdir]returnpathifdestdir.empty?File.join(options[:destdir],path.gsub(/^[a-zA-Z]:/,""))end
Source
# File lib/rubygems/commands/setup_command.rb, line 577defregenerate_binstubs(bindir)require_relative"pristine_command"say"Regenerating binstubs"args =%w[--all --only-executables --silent]args<<"--bindir=#{bindir}"args<<"--install-dir=#{default_dir}"ifoptions[:env_shebang]args<<"--env-shebang"endcommand =Gem::Commands::PristineCommand.newcommand.invoke(*args)end
Source
# File lib/rubygems/commands/setup_command.rb, line 593defregenerate_plugins(bindir)require_relative"pristine_command"say"Regenerating plugins"args =%w[--all --only-plugins --silent]args<<"--bindir=#{bindir}"args<<"--install-dir=#{default_dir}"command =Gem::Commands::PristineCommand.newcommand.invoke(*args)end
Source
# File lib/rubygems/commands/setup_command.rb, line 642defremove_file_list(files,dir)Dir.chdirdirdofiles.eachdo|file|FileUtils.rm_ffilewarn"unable to remove old file #{file} please remove it by hand"ifFile.exist?fileendendend
Source
# File lib/rubygems/commands/setup_command.rb, line 466defremove_old_bin_files(bin_dir)old_bin_files = {"gem_mirror"=>"gem mirror","gem_server"=>"gem server","gemlock"=>"gem lock","gemri"=>"ri","gemwhich"=>"gem which","index_gem_repository.rb"=>"gem generate_index",    }old_bin_files.eachdo|old_bin_file,new_name|old_bin_path =File.joinbin_dir,old_bin_filenextunlessFile.exist?old_bin_pathdeprecation_message ="`#{old_bin_file}` has been deprecated. Use `#{new_name}` instead."File.openold_bin_path,"w"do|fp|fp.write<<-EOF#!#{Gem.ruby}abort "#{deprecation_message}"    EOFendnextunlessGem.win_platform?File.open"#{old_bin_path}.bat","w"do|fp|fp.puts%(@ECHO.#{deprecation_message})endendend
Source
# File lib/rubygems/commands/setup_command.rb, line 498defremove_old_lib_files(lib_dir)lib_dirs = {File.join(lib_dir,"rubygems")=>"lib/rubygems" }lib_dirs[File.join(lib_dir,"bundler")] ="bundler/lib/bundler"lib_dirs.eachdo|old_lib_dir,new_lib_dir|lib_files =files_in(new_lib_dir)old_lib_files =files_in(old_lib_dir)to_remove =old_lib_files-lib_filesgauntlet_rubygems =File.join(lib_dir,"gauntlet_rubygems.rb")to_remove<<gauntlet_rubygemsifFile.exist?gauntlet_rubygemsto_remove.delete_ifdo|file|file.start_with?"defaults"endremove_file_list(to_remove,old_lib_dir)endend
Source
# File lib/rubygems/commands/setup_command.rb, line 519defremove_old_man_files(old_man_dir)old_man1_dir ="#{old_man_dir}/man1"ifFile.exist?(old_man1_dir)man1_to_remove =Dir.chdir(old_man1_dir) {Dir["bundle*.1{,.txt,.ronn}"] }remove_file_list(man1_to_remove,old_man1_dir)endold_man5_dir ="#{old_man_dir}/man5"ifFile.exist?(old_man5_dir)man5_to_remove =Dir.chdir(old_man5_dir) {Dir["gemfile.5{,.txt,.ronn}"] }remove_file_list(man5_to_remove,old_man5_dir)endend
Source
# File lib/rubygems/commands/setup_command.rb, line 283defshebangifoptions[:env_shebang]ruby_name =RbConfig::CONFIG["ruby_install_name"]@env_path||=ENV_PATHS.find {|env_path|File.executable?env_path }"#!#{@env_path} #{ruby_name}\n"else"#!#{Gem.ruby}\n"endend
Source
# File lib/rubygems/commands/setup_command.rb, line 537defshow_release_notesrelease_notes =File.joinDir.pwd,"CHANGELOG.md"release_notes =ifFile.exist?release_noteshistory =File.readrelease_noteshistory.force_encodingEncoding::UTF_8text =history.split(HISTORY_HEADER)text.shift# correct an off-by-one generated by splitversion_lines =history.scan(HISTORY_HEADER)versions =history.scan(VERSION_MATCHER).flatten.mapdo|x|Gem::Version.new(x)endhistory_string =""untilversions.length==0||versions.shift<=options[:previous_version]dohistory_string+=version_lines.shift+text.shiftendhistory_stringelse"Oh-no! Unable to find release notes!"endsayrelease_notesenddefuninstall_old_gemcutterrequire_relative"../uninstaller"ui =Gem::Uninstaller.new("gemcutter",all:true,ignore:true,version:"< 0.4")ui.uninstallrescueGem::InstallErrorenddefregenerate_binstubs(bindir)require_relative"pristine_command"say"Regenerating binstubs"args =%w[--all --only-executables --silent]args<<"--bindir=#{bindir}"args<<"--install-dir=#{default_dir}"ifoptions[:env_shebang]args<<"--env-shebang"endcommand =Gem::Commands::PristineCommand.newcommand.invoke(*args)enddefregenerate_plugins(bindir)require_relative"pristine_command"say"Regenerating plugins"args =%w[--all --only-plugins --silent]args<<"--bindir=#{bindir}"args<<"--install-dir=#{default_dir}"command =Gem::Commands::PristineCommand.newcommand.invoke(*args)endprivatedefdefault_dirprefix =options[:prefix]ifprefix.empty?dir =Gem.default_direlsedir =prefixendprepend_destdir_if_present(dir)enddefprepend_destdir_if_present(path)destdir =options[:destdir]returnpathifdestdir.empty?File.join(options[:destdir],path.gsub(/^[a-zA-Z]:/,""))enddefinstall_file_list(files,dest_dir)files.eachdo|file|install_filefile,dest_direndenddefinstall_file(file,dest_dir)dest_file =File.joindest_dir,filedest_dir =File.dirnamedest_fileunlessFile.directory?dest_dirmkdir_pdest_dir,mode:0o755endinstallfile,dest_file,mode:options[:data_mode]||0o644enddefremove_file_list(files,dir)Dir.chdirdirdofiles.eachdo|file|FileUtils.rm_ffilewarn"unable to remove old file #{file} please remove it by hand"ifFile.exist?fileendendenddeftarget_bin_path(bin_dir,bin_file)bin_file_formatted =ifoptions[:format_executable]Gem.default_exec_format%bin_fileelsebin_fileendFile.joinbin_dir,bin_file_formattedenddefbin_file_names@bin_file_names||= []endend
Source
# File lib/rubygems/commands/setup_command.rb, line 653deftarget_bin_path(bin_dir,bin_file)bin_file_formatted =ifoptions[:format_executable]Gem.default_exec_format%bin_fileelsebin_fileendFile.joinbin_dir,bin_file_formattedend
Source
# File lib/rubygems/commands/setup_command.rb, line 568defuninstall_old_gemcutterrequire_relative"../uninstaller"ui =Gem::Uninstaller.new("gemcutter",all:true,ignore:true,version:"< 0.4")ui.uninstallrescueGem::InstallErrorend