class Bundler::CLI - bundler: Ruby Standard Library Documentation

# class Bundler::CLI

### Constants

AUTO_INSTALL_CMDS
COMMAND_ALIASES
EXTENSIONS
PARSEABLE_COMMANDS

### Public Class Methods

aliases_for(command_name) click to toggle source

    # File bundler/cli.rb, line 55
    def self.aliases_for(command_name)
      COMMAND_ALIASES.select {|k, _| k == command_name }.invert
    end

all_aliases() click to toggle source

    # File bundler/cli.rb, line 41
    def self.all_aliases
      @all_aliases ||= begin
                         command_aliases = {}

                         COMMAND_ALIASES.each do |name, aliases|
                           Array(aliases).each do |one_alias|
                             command_aliases[one_alias] = name
                           end
                         end

                         command_aliases
                       end
    end

check_deprecated_ext_option(arguments) click to toggle source

    # File bundler/cli.rb, line 678
    def self.check_deprecated_ext_option(arguments)
      # when deprecated version of `--ext` is called
      # print out deprecation warning and pretend `--ext=c` was provided
      if deprecated_ext_value?(arguments)
        message = "Extensions can now be generated using C or Rust, so `--ext` with no arguments has been deprecated. Please select a language, e.g. `--ext=rust` to generate a Rust extension. This gem will now be generated as if `--ext=c` was used."
        removed_message = "Extensions can now be generated using C or Rust, so `--ext` with no arguments has been removed. Please select a language, e.g. `--ext=rust` to generate a Rust extension."
        SharedHelpers.major_deprecation 2, message, removed_message: removed_message
        arguments[arguments.index("--ext")] = "--ext=c"
      end
    end

deprecated_ext_value?(arguments) click to toggle source

    # File bundler/cli.rb, line 689
    def self.deprecated_ext_value?(arguments)
      index = arguments.index("--ext")
      next_argument = arguments[index + 1]

      # it is ok when --ext is followed with valid extension value
      # for example `bundle gem hello --ext c`
      return false if EXTENSIONS.include?(next_argument)

      # deprecated call when --ext is called with no value in last position
      # for example `bundle gem hello_gem --ext`
      return true if next_argument.nil?

      # deprecated call when --ext is followed by other parameter
      # for example `bundle gem --ext --no-ci hello_gem`
      return true if next_argument.start_with?("-")

      # deprecated call when --ext is followed by gem name
      # for example `bundle gem --ext hello_gem`
      return true if next_argument

      false
    end

dispatch(*) click to toggle source
Calls superclass method

    # File bundler/cli.rb, line 34
    def self.dispatch(*)
      super do |i|
        i.send(:print_command)
        i.send(:warn_on_outdated_bundler)
      end
    end

handle_no_command_error(command, has_namespace = $thor_runner) click to toggle source
Calls superclass method

    # File bundler/cli.rb, line 145
    def self.handle_no_command_error(command, has_namespace = $thor_runner)
      if Bundler.feature_flag.plugins? && Bundler::Plugin.command?(command)
        return Bundler::Plugin.exec_command(command, ARGV[1..-1])
      end

      return super unless command_path = Bundler.which("bundler-#{command}")

      Kernel.exec(command_path, *ARGV[1..-1])
    end

new(*args) click to toggle source
Calls superclass method `Bundler::Thor::Actions::new`

    # File bundler/cli.rb, line 59
    def initialize(*args)
      super

      custom_gemfile = options[:gemfile] || Bundler.settings[:gemfile]
      if custom_gemfile && !custom_gemfile.empty?
        Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", File.expand_path(custom_gemfile)
        Bundler.reset_settings_and_root!
      end

      Bundler.auto_switch

      Bundler.settings.set_command_option_if_given :retry, options[:retry]

      current_cmd = args.last[:current_command].name
      Bundler.auto_install if AUTO_INSTALL_CMDS.include?(current_cmd)
    rescue UnknownArgumentError => e
      raise InvalidOption, e.message
    ensure
      self.options ||= {}
      unprinted_warnings = Bundler.ui.unprinted_warnings
      Bundler.ui = UI::Shell.new(options)
      Bundler.ui.level = "debug" if options["verbose"]
      unprinted_warnings.each {|w| Bundler.ui.warn(w) }
    end

reformatted_help_args(args) click to toggle source

Reformat the arguments passed to bundle that include a –help flag into the corresponding ‘bundle help #{command}` call

    # File bundler/cli.rb, line 652
    def self.reformatted_help_args(args)
      bundler_commands = (COMMAND_ALIASES.keys + COMMAND_ALIASES.values).flatten

      help_flags = %w[--help -h]
      exec_commands = ["exec"] + COMMAND_ALIASES["exec"]

      help_used = args.index {|a| help_flags.include? a }
      exec_used = args.index {|a| exec_commands.include? a }

      command = args.find {|a| bundler_commands.include? a }

      if exec_used && help_used
        if exec_used + help_used == 1
          %w[help exec]
        else
          args
        end
      elsif help_used
        args = args.dup
        args.delete_at(help_used)
        ["help", command || args].flatten.compact
      else
        args
      end
    end

source_root() click to toggle source

    # File bundler/cli.rb, line 556
    def self.source_root
      File.expand_path("templates", __dir__)
    end

start(*) click to toggle source
Calls superclass method

    # File bundler/cli.rb, line 26
    def self.start(*)
      check_deprecated_ext_option(ARGV) if ARGV.include?("--ext")

      super
    ensure
      Bundler::SharedHelpers.print_major_deprecations!
    end

### Public Instance Methods

add(*gems) click to toggle source

    # File bundler/cli.rb, line 356
    def add(*gems)
      require_relative "cli/add"
      Add.new(options.dup, gems).run
    end

binstubs(*gems) click to toggle source

    # File bundler/cli.rb, line 333
    def binstubs(*gems)
      require_relative "cli/binstubs"
      Binstubs.new(options, gems).run
    end

cache() click to toggle source

    # File bundler/cli.rb, line 414
    def cache
      print_remembered_flag_deprecation("--all", "cache_all", "true") if ARGV.include?("--all")

      if ARGV.include?("--path")
        message =
          "The `--path` flag is deprecated because its semantics are unclear. " \
          "Use `bundle config cache_path` to configure the path of your cache of gems, " \
          "and `bundle config path` to configure the path where your gems are installed, " \
          "and stop using this flag"
        removed_message =
          "The `--path` flag has been removed because its semantics were unclear. " \
          "Use `bundle config cache_path` to configure the path of your cache of gems, " \
          "and `bundle config path` to configure the path where your gems are installed."
        SharedHelpers.major_deprecation 2, message, removed_message: removed_message
      end

      require_relative "cli/cache"
      Cache.new(options).run
    end

check() click to toggle source

    # File bundler/cli.rb, line 177
    def check
      remembered_flag_deprecation("path")

      require_relative "cli/check"
      Check.new(options).run
    end

clean() click to toggle source

    # File bundler/cli.rb, line 563
    def clean
      require_relative "cli/clean"
      Clean.new(options.dup).run
    end

cli_help() click to toggle source

    # File bundler/cli.rb, line 88
    def cli_help
      version
      Bundler.ui.info "\n"

      primary_commands = ["install", "update", "cache", "exec", "config", "help"]

      list = self.class.printable_commands(true)
      by_name = list.group_by {|name, _message| name.match(/^bundle (\w+)/)[1] }
      utilities = by_name.keys.sort - primary_commands
      primary_commands.map! {|name| (by_name[name] || raise("no primary command #{name}")).first }
      utilities.map! {|name| by_name[name].first }

      shell.say "Bundler commands:\n\n"

      shell.say "  Primary commands:\n"
      shell.print_table(primary_commands, indent: 4, truncate: true)
      shell.say
      shell.say "  Utilities:\n"
      shell.print_table(utilities, indent: 4, truncate: true)
      shell.say
      self.class.send(:class_options_help, shell)
    end

console(group = nil) click to toggle source

    # File bundler/cli.rb, line 480
    def console(group = nil)
      require_relative "cli/console"
      Console.new(options, group).run
    end

doctor() click to toggle source

    # File bundler/cli.rb, line 620
    def doctor
      require_relative "cli/doctor"
      Doctor.new(options).run
    end

env() click to toggle source

    # File bundler/cli.rb, line 608
    def env
      Env.write($stdout)
    end

exec(*args) click to toggle source

    # File bundler/cli.rb, line 444
    def exec(*args)
      if ARGV.include?("--no-keep-file-descriptors")
        message = "The `--no-keep-file-descriptors` has been deprecated. `bundle exec` no longer mess with your file descriptors. Close them in the exec'd script if you need to"
        removed_message = "The `--no-keep-file-descriptors` has been removed. `bundle exec` no longer mess with your file descriptors. Close them in the exec'd script if you need to"
        SharedHelpers.major_deprecation(2, message, removed_message: removed_message)
      end

      require_relative "cli/exec"
      Exec.new(options, args).run
    end

fund() click to toggle source

    # File bundler/cli.rb, line 393
    def fund
      require_relative "cli/fund"
      Fund.new(options).run
    end

gem(name) click to toggle source

    # File bundler/cli.rb, line 548
    def gem(name)
      require_relative "cli/gem"
      cmd_args = args + [self]
      cmd_args.unshift(options)

      Gem.new(*cmd_args).run
    end

help(cli = nil) click to toggle source
Calls superclass method

    # File bundler/cli.rb, line 117
    def help(cli = nil)
      cli = self.class.all_aliases[cli] if self.class.all_aliases[cli]

      case cli
      when "gemfile" then command = "gemfile"
      when nil       then command = "bundle"
      else command = "bundle-#{cli}"
      end

      man_path = File.expand_path("man", __dir__)
      man_pages = Hash[Dir.glob(File.join(man_path, "**", "*")).grep(/.*\.\d*\Z/).collect do |f|
        [File.basename(f, ".*"), f]
      end]

      if man_pages.include?(command)
        man_page = man_pages[command]
        if Bundler.which("man") && !man_path.match?(%r{^file:/.+!/META-INF/jruby.home/.+})
          Kernel.exec("man", man_page)
        else
          puts File.read("#{man_path}/#{File.basename(man_page)}.ronn")
        end
      elsif command_path = Bundler.which("bundler-#{cli}")
        Kernel.exec(command_path, "--help")
      else
        super
      end
    end

info(gem_name) click to toggle source

    # File bundler/cli.rb, line 316
    def info(gem_name)
      require_relative "cli/info"
      Info.new(options, gem_name).run
    end

init() click to toggle source

    # File bundler/cli.rb, line 163
    def init
      require_relative "cli/init"
      Init.new(options.dup).run
    end

inject(name, version) click to toggle source

    # File bundler/cli.rb, line 578
    def inject(name, version)
      SharedHelpers.major_deprecation 2, "The `inject` command has been replaced by the `add` command"
      require_relative "cli/inject"
      Inject.new(options.dup, name, version).run
    end

install() click to toggle source

    # File bundler/cli.rb, line 234
    def install
      SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")

      %w[clean deployment frozen no-prune path shebang without with].each do |option|
        remembered_flag_deprecation(option)
      end

      print_remembered_flag_deprecation("--system", "path.system", "true") if ARGV.include?("--system")

      remembered_negative_flag_deprecation("no-deployment")

      require_relative "cli/install"
      Bundler.settings.temporary(no_install: false) do
        Install.new(options.dup).run
      end
    end

issue() click to toggle source

    # File bundler/cli.rb, line 626
    def issue
      require_relative "cli/issue"
      Issue.new.run
    end

licenses() click to toggle source

    # File bundler/cli.rb, line 502
    def licenses
      Bundler.load.specs.sort_by {|s| s.license.to_s }.reverse_each do |s|
        gem_name = s.name
        license  = s.license || s.licenses

        if license.empty?
          Bundler.ui.warn "#{gem_name}: Unknown"
        else
          Bundler.ui.info "#{gem_name}: #{license}"
        end
      end
    end

list() click to toggle source

    # File bundler/cli.rb, line 306
    def list
      require_relative "cli/list"
      List.new(options).run
    end

lock() click to toggle source

    # File bundler/cli.rb, line 602
    def lock
      require_relative "cli/lock"
      Lock.new(options).run
    end

open(name) click to toggle source

    # File bundler/cli.rb, line 474
    def open(name)
      require_relative "cli/open"
      Open.new(options, name).run
    end

outdated(*gems) click to toggle source

    # File bundler/cli.rb, line 386
    def outdated(*gems)
      require_relative "cli/outdated"
      Outdated.new(options, gems).run
    end

platform() click to toggle source

    # File bundler/cli.rb, line 570
    def platform
      require_relative "cli/platform"
      Platform.new(options).run
    end

pristine(*gems) click to toggle source

    # File bundler/cli.rb, line 637
    def pristine(*gems)
      require_relative "cli/pristine"
      Bundler.settings.temporary(no_install: false) do
        Pristine.new(gems).run
      end
    end

remove(*gems) click to toggle source

    # File bundler/cli.rb, line 191
    def remove(*gems)
      if ARGV.include?("--install")
        message = "The `--install` flag has been deprecated. `bundle install` is triggered by default."
        removed_message = "The `--install` flag has been removed. `bundle install` is triggered by default."
        SharedHelpers.major_deprecation(2, message, removed_message: removed_message)
      end

      require_relative "cli/remove"
      Remove.new(gems, options).run
    end

show(gem_name = nil) click to toggle source

    # File bundler/cli.rb, line 291
    def show(gem_name = nil)
      if ARGV.include?("--outdated")
        message = "the `--outdated` flag to `bundle show` was undocumented and will be removed without replacement"
        removed_message = "the `--outdated` flag to `bundle show` was undocumented and has been removed without replacement"
        SharedHelpers.major_deprecation(2, message, removed_message: removed_message)
      end
      require_relative "cli/show"
      Show.new(options, gem_name).run
    end

update(*gems) click to toggle source

    # File bundler/cli.rb, line 276
    def update(*gems)
      SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
      require_relative "cli/update"
      Bundler.settings.temporary(no_install: false) do
        Update.new(options, gems).run
      end
    end

version() click to toggle source

    # File bundler/cli.rb, line 486
    def version
      cli_help = current_command.name == "cli_help"
      if cli_help || ARGV.include?("version")
        build_info = " (#{BuildMetadata.built_at} commit #{BuildMetadata.git_commit_sha})"
      end

      if !cli_help && Bundler.feature_flag.print_only_version_number?
        Bundler.ui.info "#{Bundler::VERSION}#{build_info}"
      else
        Bundler.ui.info "Bundler version #{Bundler::VERSION}#{build_info}"
      end
    end

viz() click to toggle source

    # File bundler/cli.rb, line 527
    def viz
      SharedHelpers.major_deprecation 2, "The `viz` command has been renamed to `graph` and moved to a plugin. See https://github.com/rubygems/bundler-graph"
      require_relative "cli/viz"
      Viz.new(options.dup).run
    end

### Private Instance Methods

current_command() click to toggle source

    # File bundler/cli.rb, line 714
    def current_command
      _, _, config = @_initializer
      config[:current_command]
    end

flag_deprecation(name, flag_name, option) click to toggle source

    # File bundler/cli.rb, line 774
    def flag_deprecation(name, flag_name, option)
      name_index = ARGV.find {|arg| flag_name == arg.split("=")[0] }
      return unless name_index

      value = options[name]
      value = value.join(" ").to_s if option.type == :array
      value = "'#{value}'" unless option.type == :boolean

      print_remembered_flag_deprecation(flag_name, name.tr("-", "_"), value)
    end

print_command() click to toggle source

    # File bundler/cli.rb, line 719
    def print_command
      return unless Bundler.ui.debug?
      cmd = current_command
      command_name = cmd.name
      return if PARSEABLE_COMMANDS.include?(command_name)
      command = ["bundle", command_name] + args
      options_to_print = options.dup
      options_to_print.delete_if do |k, v|
        next unless o = cmd.options[k]
        o.default == v
      end
      command << Thor::Options.to_switches(options_to_print.sort_by(&:first)).strip
      command.reject!(&:empty?)
      Bundler.ui.info "Running `#{command * " "}` with bundler #{Bundler::VERSION}"
    end

print_remembered_flag_deprecation(flag_name, option_name, option_value) click to toggle source

    # File bundler/cli.rb, line 785
    def print_remembered_flag_deprecation(flag_name, option_name, option_value)
      message =
        "The `#{flag_name}` flag is deprecated because it relies on being " \
        "remembered across bundler invocations, which bundler will no longer " \
        "do in future versions. Instead please use `bundle config set #{option_name} " \
        "#{option_value}`, and stop using this flag"
      removed_message =
        "The `#{flag_name}` flag has been removed because it relied on being " \
        "remembered across bundler invocations, which bundler will no longer " \
        "do. Instead please use `bundle config set #{option_name} " \
        "#{option_value}`, and stop using this flag"
      Bundler::SharedHelpers.major_deprecation 2, message, removed_message: removed_message
    end

remembered_flag_deprecation(name) click to toggle source

    # File bundler/cli.rb, line 767
    def remembered_flag_deprecation(name)
      option = current_command.options[name]
      flag_name = option.switch_name

      flag_deprecation(name, flag_name, option)
    end

remembered_negative_flag_deprecation(name) click to toggle source

    # File bundler/cli.rb, line 759
    def remembered_negative_flag_deprecation(name)
      positive_name = name.gsub(/\Ano-/, "")
      option = current_command.options[positive_name]
      flag_name = "--no-" + option.switch_name.gsub(/\A--/, "")

      flag_deprecation(positive_name, flag_name, option)
    end

warn_on_outdated_bundler() click to toggle source

    # File bundler/cli.rb, line 735
    def warn_on_outdated_bundler
      return if Bundler.settings[:disable_version_check]

      command_name = current_command.name
      return if PARSEABLE_COMMANDS.include?(command_name)

      return unless SharedHelpers.md5_available?

      require_relative "vendored_uri"
      remote = Source::Rubygems::Remote.new(Gem::URI("https://rubygems.org"))
      cache_path = Bundler.user_cache.join("compact_index", remote.cache_slug)
      latest = Bundler::CompactIndexClient.new(cache_path).latest_version("bundler")
      return unless latest

      current = Gem::Version.new(VERSION)
      return if current >= latest

      Bundler.ui.warn \
        "The latest bundler is #{latest}, but you are currently running #{current}.\n" \
        "To update to the most recent version, run `bundle update --bundler`"
    rescue RuntimeError
      nil
    end