class Rake::Application

Rake 主应用程序对象。当从命令行调用 rake 时,会创建一个 Rake::Application 对象并运行它。

常量

DEFAULT_RAKEFILES

属性

name[R]

应用程序的名称(通常为 ‘rake’)

original_dir[R]

调用 rake 的原始目录。

rakefile[R]

使用的实际 Rakefile 的名称。

terminal_columns[RW]

终端上的列数

top_level_tasks[R]

顶层任务名称列表(来自命令行的任务名称)。

tty_output[W]

覆盖检测到的 TTY 输出状态(主要用于测试)

公共类方法

new() 点击切换源码

初始化一个 Rake::Application 对象。

调用超类方法
# File rake-13.2.1/lib/rake/application.rb, line 49
def initialize
  super
  @name = "rake"
  @rakefiles = DEFAULT_RAKEFILES.dup
  @rakefile = nil
  @pending_imports = []
  @imported = []
  @loaders = {}
  @default_loader = Rake::DefaultLoader.new
  @original_dir = Dir.pwd
  @top_level_tasks = []
  add_loader("rb", DefaultLoader.new)
  add_loader("rf", DefaultLoader.new)
  add_loader("rake", DefaultLoader.new)
  @tty_output = STDOUT.tty?
  @terminal_columns = ENV["RAKE_COLUMNS"].to_i

  set_default_options
end

公共实例方法

add_loader(ext, loader) 点击切换源码

添加一个加载器来处理以扩展名 ext 结尾的导入文件。

# File rake-13.2.1/lib/rake/application.rb, line 161
def add_loader(ext, loader)
  ext = ".#{ext}" unless ext =~ /^\./
  @loaders[ext] = loader
end
execute(*) 点击切换源码
调用超类方法
# File rake-13.2.1/lib/rake/application.rb, line 107
def execute(*)
  exception = DEBUGGER__::SESSION.capture_exception_frames(/(exe|bin|lib)\/rake/) do
    super
  end

  if exception
    STDERR.puts exception.message
    DEBUGGER__::SESSION.enter_postmortem_session exception
    raise exception
  end
end
init(app_name="rake", argv = ARGV) 点击切换源码

初始化命令行参数和应用程序名称。

# File rake-13.2.1/lib/rake/application.rb, line 88
def init(app_name="rake", argv = ARGV)
  standard_exception_handling do
    @name = app_name
    begin
      args = handle_options argv
    rescue ArgumentError
      # Backward compatibility for capistrano
      args = handle_options
    end
    load_debug_at_stop_feature
    collect_command_line_tasks(args)
  end
end
load_rakefile() 点击切换源码

查找 Rakefile,然后加载它和任何待处理的导入。

# File rake-13.2.1/lib/rake/application.rb, line 124
def load_rakefile
  standard_exception_handling do
    raw_load_rakefile
  end
end
options() 点击切换源码

来自命令行的 Application 选项

# File rake-13.2.1/lib/rake/application.rb, line 167
def options
  @options ||= Struct.new(
    :always_multitask, :backtrace, :build_all, :dryrun,
    :ignore_deprecate, :ignore_system, :job_stats, :load_system,
    :nosearch, :rakelib, :show_all_tasks, :show_prereqs,
    :show_task_pattern, :show_tasks, :silent, :suppress_backtrace_pattern,
    :thread_pool_size, :trace, :trace_output, :trace_rules
  ).new
end
run(argv = ARGV) 点击切换源码

运行 Rake 应用程序。run 方法执行以下三个步骤

  • 初始化命令行选项 (init)。

  • 定义任务 (load_rakefile)。

  • 运行顶层任务 (top_level)。

如果您想构建自定义的 rake 命令,您应该在您的应用程序上调用 init。然后定义任何任务。最后,调用 top_level 来运行您的顶层任务。

# File rake-13.2.1/lib/rake/application.rb, line 79
def run(argv = ARGV)
  standard_exception_handling do
    init "rake", argv
    load_rakefile
    top_level
  end
end
run_with_threads() { || ... } 点击切换源码

在线程启动和关闭的情况下运行给定的代码块。

# File rake-13.2.1/lib/rake/application.rb, line 144
def run_with_threads
  thread_pool.gather_history if options.job_stats == :history

  yield

  thread_pool.join if defined?(@thread_pool)
  if options.job_stats
    stats = thread_pool.statistics
    puts "Maximum active threads: #{stats[:max_active_threads]} + main"
    puts "Total threads in play:  #{stats[:total_threads_in_play]} + main"
  end
  ThreadHistoryDisplay.new(thread_pool.history).show if
    options.job_stats == :history
end
top_level() 点击切换源码

运行 Rake 应用程序的顶层任务。

# File rake-13.2.1/lib/rake/application.rb, line 131
def top_level
  run_with_threads do
    if options.show_tasks
      display_tasks_and_comments
    elsif options.show_prereqs
      display_prerequisites
    else
      top_level_tasks.each { |task_name| invoke_task(task_name) }
    end
  end
end

私有实例方法

load_debug_at_stop_feature() 点击切换源码
# File rake-13.2.1/lib/rake/application.rb, line 102
def load_debug_at_stop_feature
  return unless ENV["RAKE_DEBUG"]
  require "debug/session"
  DEBUGGER__::start no_sigint_hook: true, nonstop: true
  Rake::Task.prepend Module.new {
    def execute(*)
      exception = DEBUGGER__::SESSION.capture_exception_frames(/(exe|bin|lib)\/rake/) do
        super
      end

      if exception
        STDERR.puts exception.message
        DEBUGGER__::SESSION.enter_postmortem_session exception
        raise exception
      end
    end
  }
rescue LoadError
end