class Bundler::CLI
def cache
def cache Bundler.definition.resolve_with_cache! Bundler.load.cache Bundler.settings[:no_prune] = true if options[:no_prune] Bundler.load.lock rescue GemNotFound => e Bundler.ui.error(e.message) Bundler.ui.warn "Run `bundle install` to install missing gems." exit 128 end
def check
def check not_installed = Bundler.definition.missing_specs if not_installed.any? Bundler.ui.error "The following gems are missing" not_installed.each { |s| Bundler.ui.error " * #{s.name} (#{s.version})" } Bundler.ui.warn "Install missing gems with `bundle install`" exit 1 else Bundler.load.lock Bundler.ui.info "The Gemfile's dependencies are satisfied" end end
def config(name = nil, *args)
def config(name = nil, *args) values = ARGV.dup values.shift # remove config values.shift # remove the name unless name Bundler.ui.confirm "Settings are listed in order of priority. The top value will be used.\n" Bundler.settings.all.each do |setting| Bundler.ui.confirm "#{setting}" with_padding do Bundler.settings.pretty_values_for(setting).each do |line| Bundler.ui.info line end end Bundler.ui.confirm "" end return end if values.empty? Bundler.ui.confirm "Settings for `#{name}` in order of priority. The top value will be used" with_padding do Bundler.settings.pretty_values_for(name).each { |line| Bundler.ui.info line } end else locations = Bundler.settings.locations(name) if local = locations[:local] Bundler.ui.info "Your application has set #{name} to #{local.inspect}. This will override the " \ "system value you are currently setting" end if global = locations[:global] Bundler.ui.info "You are replacing the current system value of #{name}, which is currently #{global}" end if env = locations[:env] Bundler.ui.info "You have set a bundler environment variable for #{env}. This will take precedence " \ "over the system value you are setting" end Bundler.settings.set_global(name, values.join(" ")) end end
def console(group = nil)
def console(group = nil) require 'bundler/setup' group ? Bundler.require(:default, group) : Bundler.require ARGV.clear require 'irb' IRB.start end
def exec(*)
def exec(*) ARGV.delete("exec") Bundler.setup begin # Run Kernel.exec(*ARGV) rescue Errno::EACCES Bundler.ui.error "bundler: not executable: #{ARGV.first}" rescue Errno::ENOENT Bundler.ui.error "bundler: command not found: #{ARGV.first}" Bundler.ui.warn "Install missing gem binaries with `bundle install`" end end
def init
def init opts = options.dup if File.exist?("Gemfile") Bundler.ui.error "Gemfile already exists at #{Dir.pwd}/Gemfile" exit 1 end if opts[:gemspec] gemspec = File.expand_path(opts[:gemspec]) unless File.exist?(gemspec) Bundler.ui.error "Gem specification #{gemspec} doesn't exist" exit 1 end spec = Gem::Specification.load(gemspec) puts "Writing new Gemfile to #{Dir.pwd}/Gemfile" File.open('Gemfile', 'w') do |file| file << "# Generated from #{gemspec}\n" file << spec.to_gemfile end else puts "Writing new Gemfile to #{Dir.pwd}/Gemfile" FileUtils.cp(File.expand_path('../templates/Gemfile', __FILE__), 'Gemfile') end end
def initialize(*)
def initialize(*) super use_shell = options["no-color"] ? Thor::Shell::Basic.new : shell Bundler.ui = UI::Shell.new(use_shell) Gem::DefaultUserInteraction.ui = UI::RGProxy.new(Bundler.ui) end
def install(path = nil)
def install(path = nil) opts = options.dup opts[:without] ||= [] opts[:without].map! { |g| g.to_sym } # Can't use Bundler.settings for this because settings needs gemfile.dirname ENV['BUNDLE_GEMFILE'] = opts[:gemfile] if opts[:gemfile] Bundler.settings[:path] = path if path Bundler.settings[:bin] = opts["binstubs"] if opts[:binstubs] Bundler.settings[:disable_shared_gems] = '1' if options["disable-shared-gems"] || path Bundler.settings.without = opts[:without] Bundler.ui.be_quiet! if opts[:quiet] Installer.install(Bundler.root, Bundler.definition, opts) Bundler.load.cache if Bundler.root.join("vendor/cache").exist? Bundler.ui.confirm "Your bundle is complete! " + "Use `bundle show [gemname]` to see where a bundled gem is installed." rescue GemNotFound => e if Bundler.definition.no_sources? Bundler.ui.warn "Your Gemfile doesn't have any sources. You can add one with a line like 'source :gemcutter'" end raise e end
def locate_gem(name)
def locate_gem(name) spec = Bundler.load.specs.find{|s| s.name == name } raise GemNotFound, "Could not find gem '#{name}' in the current bundle." unless spec if spec.name == 'bundler' return File.expand_path('../../../', __FILE__) end spec.full_gem_path end
def lock
def lock Bundler.ui.warn "Lock is deprecated. Your bundle is now locked whenever you run `bundle install`." end
def open(name)
def open(name) editor = [ENV['BUNDLER_EDITOR'], ENV['VISUAL'], ENV['EDITOR']].find{|e| !e.nil? && !e.empty? } if editor command = "#{editor} #{locate_gem(name)}" success = system(command) Bundler.ui.info "Could not run '#{command}'" unless success else Bundler.ui.info("To open a bundled gem, set $EDITOR or $BUNDLER_EDITOR") end end
def package
def package install # TODO: move cache contents here now that all bundles are locked Bundler.load.cache end
def show(gem_name = nil)
def show(gem_name = nil) Bundler.load.lock if gem_name Bundler.ui.info locate_gem(gem_name) else Bundler.ui.info "Gems included by the bundle:" Bundler.load.specs.sort_by { |s| s.name }.each do |s| Bundler.ui.info " * #{s.name} (#{s.version}#{s.git_version})" end end end
def unlock
def unlock Bundler.ui.warn "Unlock is deprecated. To update to newer gem versions, use `bundle update`." end
def update(*gems)
def update(*gems) sources = Array(options[:source]) if gems.empty? && sources.empty? # We're doing a full update Bundler.definition(true) else Bundler.definition(:gems => gems, :sources => sources) end Installer.install Bundler.root, Bundler.definition, "update" => true Bundler.load.cache if Bundler.root.join("vendor/cache").exist? Bundler.ui.confirm "Your bundle is updated! " + "Use `bundle show [gemname]` to see where a bundled gem is installed." end
def version
def version Bundler.ui.info "Bundler version #{Bundler::VERSION}" end
def viz
def viz output_file = File.expand_path(options[:file]) graph = Graph.new( Bundler.load ) begin graph.viz(output_file, options[:version], options[:requirements]) Bundler.ui.info output_file rescue LoadError => e Bundler.ui.error e.inspect Bundler.ui.warn "Make sure you have the graphviz ruby gem. You can install it with:" Bundler.ui.warn "`gem install ruby-graphviz`" rescue StandardError => e if e.message =~ /GraphViz not installed or dot not in PATH/ Bundler.ui.error e.message Bundler.ui.warn "The ruby graphviz gem requires GraphViz to be installed" else raise end end end