模块 Rake::TaskManager

TaskManager 模块是一个用于管理任务的混入模块。

属性

last_description[读/写]

跟踪 Rakefile 中最后一条注释。

公共实例方法

[](task_name, scopes=nil) 点击切换源码

查找与 task_name 匹配的任务。

# File rake-13.2.1/lib/rake/task_manager.rb, line 54
def [](task_name, scopes=nil)
  task_name = task_name.to_s
  self.lookup(task_name, scopes) or
    enhance_with_matching_rule(task_name) or
    synthesize_file_task(task_name) or
    fail generate_message_for_undefined_task(task_name)
end
clear() 点击切换源码

清除此应用程序中的所有任务。

# File rake-13.2.1/lib/rake/task_manager.rb, line 182
def clear
  @tasks.clear
  @rules.clear
end
current_scope() 点击切换源码

返回任务管理器中当前活动的范围名称列表。

# File rake-13.2.1/lib/rake/task_manager.rb, line 222
def current_scope
  @scope
end
enhance_with_matching_rule(task_name, level=0) 点击切换源码

如果可以找到与任务名称匹配的规则,则使用该规则的先决条件和操作来增强任务。为规则适当设置任务的 source 属性。返回增强的任务;如果没有找到规则,则返回 nil。

# File rake-13.2.1/lib/rake/task_manager.rb, line 151
def enhance_with_matching_rule(task_name, level=0)
  fail Rake::RuleRecursionOverflowError,
    "Rule Recursion Too Deep" if level >= 16
  @rules.each do |pattern, args, extensions, order_only, block|
    if pattern && pattern.match(task_name)
      task = attempt_rule(task_name, pattern, args, extensions, block, level)
      task | order_only unless order_only.nil?
      return task if task
    end
  end
  nil
rescue Rake::RuleRecursionOverflowError => ex
  ex.add_target(task_name)
  fail ex
end
generate_did_you_mean_suggestions(task_name) 点击切换源码
# File rake-13.2.1/lib/rake/task_manager.rb, line 68
def generate_did_you_mean_suggestions(task_name)
  return "" unless defined?(::DidYouMean::SpellChecker)

  suggestions = ::DidYouMean::SpellChecker.new(dictionary: @tasks.keys).correct(task_name.to_s)
  if ::DidYouMean.respond_to?(:formatter)# did_you_mean v1.2.0 or later
    ::DidYouMean.formatter.message_for(suggestions)
  elsif defined?(::DidYouMean::Formatter) # before did_you_mean v1.2.0
    ::DidYouMean::Formatter.new(suggestions).to_s
  else
    ""
  end
end
generate_message_for_undefined_task(task_name) 点击切换源码
# File rake-13.2.1/lib/rake/task_manager.rb, line 62
def generate_message_for_undefined_task(task_name)
  message = "Don't know how to build task '#{task_name}' "\
            "(See the list of available tasks with `#{Rake.application.name} --tasks`)"
  message + generate_did_you_mean_suggestions(task_name)
end
in_namespace(name) { |ns| ... } 点击切换源码

在名为 name 的嵌套命名空间中评估代码块。如果 name 为 nil,则创建一个匿名命名空间。

# File rake-13.2.1/lib/rake/task_manager.rb, line 228
def in_namespace(name)
  name ||= generate_name
  @scope = Scope.new(name, @scope)
  ns = NameSpace.new(self, @scope)
  yield(ns)
  ns
ensure
  @scope = @scope.tail
end
intern(task_class, task_name) 点击切换源码

查找任务。如果找到现有任务则返回;否则创建当前类型的任务。

# File rake-13.2.1/lib/rake/task_manager.rb, line 49
def intern(task_class, task_name)
  @tasks[task_name.to_s] ||= task_class.new(task_name, self)
end
lookup(task_name, initial_scope=nil) 点击切换源码

查找任务,使用任务名称中的作用域和作用域提示。此方法执行直接查找,而不尝试合成文件任务或规则。特殊作用域名称(例如,“^”)会被识别。如果没有提供作用域参数,则使用当前作用域。如果找不到任务,则返回 nil。

# File rake-13.2.1/lib/rake/task_manager.rb, line 192
def lookup(task_name, initial_scope=nil)
  initial_scope ||= @scope
  task_name = task_name.to_s
  if task_name =~ /^rake:/
    scopes = Scope.make
    task_name = task_name.sub(/^rake:/, "")
  elsif task_name =~ /^(\^+)/
    scopes = initial_scope.trim($1.size)
    task_name = task_name.sub(/^(\^+)/, "")
  else
    scopes = initial_scope
  end
  lookup_in_scope(task_name, scopes)
end
resolve_args(args) 点击切换源码

解析任务/规则的参数。返回 [task_name, arg_name_list, prerequisites, order_only_prerequisites] 的元组。

# File rake-13.2.1/lib/rake/task_manager.rb, line 88
def resolve_args(args)
  if args.last.is_a?(Hash)
    deps = args.pop
    resolve_args_with_dependencies(args, deps)
  else
    resolve_args_without_dependencies(args)
  end
end
tasks() 点击切换源码

此应用程序中定义的所有任务的列表。

# File rake-13.2.1/lib/rake/task_manager.rb, line 168
def tasks
  @tasks.values.sort_by { |t| t.name }
end
tasks_in_scope(scope) 点击切换源码

给定作用域(及其子作用域)中定义的所有任务的列表。

# File rake-13.2.1/lib/rake/task_manager.rb, line 174
def tasks_in_scope(scope)
  prefix = scope.path
  tasks.select { |t|
    /^#{prefix}:/ =~ t.name
  }
end

私有实例方法

add_location(task) 点击切换源码

将位置添加到给定任务的位置字段。

# File rake-13.2.1/lib/rake/task_manager.rb, line 241
def add_location(task)
  loc = find_location
  task.locations << loc if loc
  task
end
attempt_rule(task_name, task_pattern, args, extensions, block, level) 点击切换源码

尝试根据先决条件列表创建规则。

# File rake-13.2.1/lib/rake/task_manager.rb, line 271
def attempt_rule(task_name, task_pattern, args, extensions, block, level)
  sources = make_sources(task_name, task_pattern, extensions)
  prereqs = sources.map { |source|
    trace_rule level, "Attempting Rule #{task_name} => #{source}"
    if File.exist?(source) || Rake::Task.task_defined?(source)
      trace_rule level, "(#{task_name} => #{source} ... EXIST)"
      source
    elsif parent = enhance_with_matching_rule(source, level + 1)
      trace_rule level, "(#{task_name} => #{source} ... ENHANCE)"
      parent.name
    else
      trace_rule level, "(#{task_name} => #{source} ... FAIL)"
      return nil
    end
  }
  task = FileTask.define_task(task_name, { args => prereqs }, &block)
  task.sources = prereqs
  task
end
find_location() 点击切换源码

查找调用 dsl 层的所在位置。

# File rake-13.2.1/lib/rake/task_manager.rb, line 248
def find_location
  locations = caller
  i = 0
  while locations[i]
    return locations[i + 1] if locations[i] =~ /rake\/dsl_definition.rb/
    i += 1
  end
  nil
end
generate_name() 点击切换源码

生成匿名命名空间名称。

# File rake-13.2.1/lib/rake/task_manager.rb, line 259
def generate_name
  @seed ||= 0
  @seed += 1
  "_anon_#{@seed}"
end
get_description(task) 点击切换源码

返回当前描述,并在过程中清除它。

# File rake-13.2.1/lib/rake/task_manager.rb, line 319
def get_description(task)
  desc = @last_description
  @last_description = nil
  desc
end
lookup_in_scope(name, scope) 点击切换源码

查找任务名称

# File rake-13.2.1/lib/rake/task_manager.rb, line 208
def lookup_in_scope(name, scope)
  loop do
    tn = scope.path_with_task_name(name)
    task = @tasks[tn]
    return task if task
    break if scope.empty?
    scope = scope.tail
  end
  nil
end
make_sources(task_name, task_pattern, extensions) 点击切换源码

从文件扩展名/转换过程的列表中创建源列表。

# File rake-13.2.1/lib/rake/task_manager.rb, line 293
def make_sources(task_name, task_pattern, extensions)
  result = extensions.map { |ext|
    case ext
    when /%/
      task_name.pathmap(ext)
    when %r{/}
      ext
    when /^\./
      source = task_name.sub(task_pattern, ext)
      source == ext ? task_name.ext(ext) : source
    when String, Symbol
      ext.to_s
    when Proc, Method
      if ext.arity == 1
        ext.call(task_name)
      else
        ext.call
      end
    else
      fail "Don't know how to handle rule dependent: #{ext.inspect}"
    end
  }
  result.flatten
end
resolve_args_without_dependencies(args) 点击切换源码

当没有声明依赖项时,解析任务或规则的任务参数。

此参数解析函数识别的模式是

task :t
task :t, [:a]
# File rake-13.2.1/lib/rake/task_manager.rb, line 105
def resolve_args_without_dependencies(args)
  task_name = args.shift
  if args.size == 1 && args.first.respond_to?(:to_ary)
    arg_names = args.first.to_ary
  else
    arg_names = args
  end
  [task_name, arg_names, [], nil]
end