class Rake::Task

Task 是 Rakefile 中工作的基本单元。任务具有关联的动作(可能不止一个)和先决条件列表。当调用时,任务将首先确保其所有先决条件都有机会运行,然后它将执行自己的动作。

通常不使用 new 方法直接创建任务,而是使用 filetask 便利方法。

属性

actions[R]

附加到任务的动作列表。

already_invoked[R]

此任务是否已被调用? 除非重新启用它们,否则将跳过已调用的任务。

application[RW]

拥有此任务的 Application

locations[R]

此任务的每个任务定义的文件/行位置(仅当任务定义时设置了检测位置选项时才有效)。

order_only_prerequisites[R]

任务的仅顺序先决条件列表。

prereqs[R]

任务的先决条件列表。

prerequisites[R]

任务的先决条件列表。

scope[R]

用于此任务查找的嵌套命名空间名称的数组。

sources[W]

任务的来源列表。

公共类方法

[](task_name) 单击以切换源代码

返回具有给定名称的任务。 如果当前不知道该任务,请尝试从定义的规则中合成一个。 如果找不到规则,但是现有文件与任务名称匹配,则假定它是没有依赖项或操作的文件任务。

# File rake-13.2.1/lib/rake/task.rb, line 404
def [](task_name)
  Rake.application[task_name]
end
clear() 单击以切换源代码

清除任务列表。 这会导致 rake 立即忘记已分配的所有任务。(通常在单元测试中使用。)

# File rake-13.2.1/lib/rake/task.rb, line 391
def clear
  Rake.application.clear
end
create_rule(*args, &block) 单击以切换源代码

定义一个用于合成任务的规则。

# File rake-13.2.1/lib/rake/task.rb, line 421
def create_rule(*args, &block)
  Rake.application.create_rule(*args, &block)
end
define_task(*args, &block) 单击以切换源代码

给定 args 和一个可选块来定义一个任务。 如果具有给定名称的规则已经存在,则将先决条件和操作添加到现有任务。 返回定义的任务。

# File rake-13.2.1/lib/rake/task.rb, line 416
def define_task(*args, &block)
  Rake.application.define_task(self, *args, &block)
end
format_deps(deps) 单击以切换源代码

格式化传递给任务的依赖项参数。

# File rake-13.2.1/lib/rake/task.rb, line 373
def self.format_deps(deps)
  deps = [deps] unless deps.respond_to?(:to_ary)
  deps.map { |d| Rake.from_pathname(d).to_s }
end
new(task_name, app) 单击以切换源代码

创建一个名为 task_name 的任务,没有操作或先决条件。 使用 enhance 添加操作和先决条件。

# File rake-13.2.1/lib/rake/task.rb, line 99
def initialize(task_name, app)
  @name            = task_name.to_s
  @prerequisites   = []
  @actions         = []
  @already_invoked = false
  @comments        = []
  @lock            = Monitor.new
  @application     = app
  @scope           = app.current_scope
  @arg_names       = nil
  @locations       = []
  @invocation_exception = nil
  @order_only_prerequisites = []
end
scope_name(scope, task_name) 单击以切换源代码

根据此类任务的规则,将作用域应用于任务名称。 通用任务将接受作用域作为名称的一部分。

# File rake-13.2.1/lib/rake/task.rb, line 428
def scope_name(scope, task_name)
  scope.path_with_task_name(task_name)
end
task_defined?(task_name) 单击以切换源代码

如果已经定义了任务名称,则为 TRUE。

# File rake-13.2.1/lib/rake/task.rb, line 409
def task_defined?(task_name)
  Rake.application.lookup(task_name) != nil
end
tasks() 单击以切换源代码

所有已定义任务的列表。

# File rake-13.2.1/lib/rake/task.rb, line 396
def tasks
  Rake.application.tasks
end

公共实例方法

add_description(description) 单击以切换源代码

向任务添加描述。 描述可以由可选的参数列表(用括号括起来)和一个可选的注释组成。

# File rake-13.2.1/lib/rake/task.rb, line 298
def add_description(description)
  return unless description
  comment = description.strip
  add_comment(comment) if comment && !comment.empty?
end
all_prerequisite_tasks() 单击以切换源代码

所有唯一的先决条件任务列表,包括先决条件任务的先决条件。 当发现循环依赖项时,包括自身。

# File rake-13.2.1/lib/rake/task.rb, line 77
def all_prerequisite_tasks
  seen = {}
  collect_prerequisites(seen)
  seen.values
end
arg_names() 单击以切换源代码

此任务的参数名称。

# File rake-13.2.1/lib/rake/task.rb, line 141
def arg_names
  @arg_names || []
end
clear() 单击以切换源代码

清除 rake 任务的现有先决条件,操作,注释和参数。

# File rake-13.2.1/lib/rake/task.rb, line 153
def clear
  clear_prerequisites
  clear_actions
  clear_comments
  clear_args
  self
end
clear_actions() 单击以切换源代码

清除 rake 任务上的现有操作。

# File rake-13.2.1/lib/rake/task.rb, line 168
def clear_actions
  actions.clear
  self
end
clear_args() 单击以切换源代码

清除 rake 任务上的现有参数。

# File rake-13.2.1/lib/rake/task.rb, line 180
def clear_args
  @arg_names = nil
  self
end
clear_comments() 单击以切换源代码

清除 rake 任务上的现有注释。

# File rake-13.2.1/lib/rake/task.rb, line 174
def clear_comments
  @comments = []
  self
end
clear_prerequisites() 单击以切换源代码

清除 rake 任务的现有先决条件。

# File rake-13.2.1/lib/rake/task.rb, line 162
def clear_prerequisites
  prerequisites.clear
  self
end
comment() 单击以切换源代码

所有注释的第一行(或句子)。 多个注释用“/”分隔。

# File rake-13.2.1/lib/rake/task.rb, line 322
def comment
  transform_comments(" / ") { |c| first_sentence(c) }
end
enhance(deps=nil, &block) 单击以切换源代码

使用先决条件或操作增强任务。 返回 self。

# File rake-13.2.1/lib/rake/task.rb, line 115
def enhance(deps=nil, &block)
  @prerequisites |= deps if deps
  @actions << block if block_given?
  self
end
execute(args=nil) 单击以切换源代码

执行与此任务关联的操作。

# File rake-13.2.1/lib/rake/task.rb, line 270
def execute(args=nil)
  args ||= EMPTY_TASK_ARGS
  if application.options.dryrun
    application.trace "** Execute (dry run) #{name}"
    return
  end
  application.trace "** Execute #{name}" if application.options.trace
  application.enhance_with_matching_rule(name) if @actions.empty?
  if opts = Hash.try_convert(args) and !opts.empty?
    @actions.each { |act| act.call(self, args, **opts) }
  else
    @actions.each { |act| act.call(self, args) }
  end
end
full_comment() 单击以切换源代码

完整注释集合。 多个注释用换行符分隔。

# File rake-13.2.1/lib/rake/task.rb, line 316
def full_comment
  transform_comments("\n")
end
investigation() 单击以切换源代码

返回描述任务内部状态的字符串。 用于调试。

# File rake-13.2.1/lib/rake/task.rb, line 354
def investigation
  result = "------------------------------\n".dup
  result << "Investigating #{name}\n"
  result << "class: #{self.class}\n"
  result <<  "task needed: #{needed?}\n"
  result <<  "timestamp: #{timestamp}\n"
  result << "pre-requisites: \n"
  prereqs = prerequisite_tasks
  prereqs.sort! { |a, b| a.timestamp <=> b.timestamp }
  prereqs.each do |p|
    result << "--#{p.name} (#{p.timestamp})\n"
  end
  latest_prereq = prerequisite_tasks.map(&:timestamp).max
  result <<  "latest-prerequisite time: #{latest_prereq}\n"
  result << "................................\n\n"
  return result
end
invoke(*args) 单击以切换源代码

如果需要,则调用该任务。 先调用先决条件。

# File rake-13.2.1/lib/rake/task.rb, line 186
def invoke(*args)
  task_args = TaskArguments.new(arg_names, args)
  invoke_with_call_chain(task_args, InvocationChain::EMPTY)
end
name() 单击以切换源代码

任务的名称,包括任何命名空间限定符。

# File rake-13.2.1/lib/rake/task.rb, line 122
def name
  @name.to_s
end
needed?() 单击以切换源代码

是否需要此任务?

# File rake-13.2.1/lib/rake/task.rb, line 286
def needed?
  true
end
prerequisite_tasks() 单击以切换源代码

先决条件任务列表

# File rake-13.2.1/lib/rake/task.rb, line 61
def prerequisite_tasks
  (prerequisites + order_only_prerequisites).map { |pre| lookup_prerequisite(pre) }
end
reenable() 单击以切换源代码

重新启用任务,如果再次调用任务,则允许执行其任务。

# File rake-13.2.1/lib/rake/task.rb, line 147
def reenable
  @already_invoked = false
  @invocation_exception = nil
end
set_arg_names(args) 单击以切换源代码

设置此任务的参数名称。 args 应该是一个符号数组,每个参数名称一个。

# File rake-13.2.1/lib/rake/task.rb, line 348
def set_arg_names(args)
  @arg_names = args.map(&:to_sym)
end
source() 单击以切换源代码

来自规则的第一个来源(如果没有来源则为 nil)

# File rake-13.2.1/lib/rake/task.rb, line 93
def source
  sources.first
end
sources() 单击以切换源代码
# File rake-13.2.1/lib/rake/task.rb, line 52
def sources
  if defined?(@sources)
    @sources
  else
    prerequisites
  end
end
timestamp() 单击以切换源代码

此任务的时间戳。 基本任务返回其时间戳的当前时间。 其他任务可能更复杂。

# File rake-13.2.1/lib/rake/task.rb, line 292
def timestamp
  Time.now
end
to_s() 单击以切换源代码

返回任务名称

# File rake-13.2.1/lib/rake/task.rb, line 42
def to_s
  name
end
|(deps) 单击以切换源代码

添加仅顺序依赖项。

# File rake-13.2.1/lib/rake/task.rb, line 379
def |(deps)
  @order_only_prerequisites |= Task.format_deps(deps) - @prerequisites
  self
end

受保护的实例方法

invoke_with_call_chain(task_args, invocation_chain) 单击以切换源代码

与 invoke 相同,但显式传递调用链以检测循环依赖项。

如果多个任务并行依赖于此任务,则如果此任务的第一次执行失败,它们都将失败。

# File rake-13.2.1/lib/rake/task.rb, line 197
def invoke_with_call_chain(task_args, invocation_chain)
  new_chain = Rake::InvocationChain.append(self, invocation_chain)
  @lock.synchronize do
    begin
      if application.options.trace
        application.trace "** Invoke #{name} #{format_trace_flags}"
      end

      if @already_invoked
        if @invocation_exception
          if application.options.trace
            application.trace "** Previous invocation of #{name} failed #{format_trace_flags}"
          end
          raise @invocation_exception
        else
          return
        end
      end

      @already_invoked = true

      invoke_prerequisites(task_args, new_chain)
      execute(task_args) if needed?
    rescue Exception => ex
      add_chain_to(ex, new_chain)
      @invocation_exception = ex
      raise ex
    end
  end
end

私有实例方法

first_sentence(string) 单击以切换源代码

获取字符串中的第一个句子。 该句子由第一个句点,感叹号或行尾终止。 小数点不算作句点。

# File rake-13.2.1/lib/rake/task.rb, line 341
def first_sentence(string)
  string.split(/(?<=\w)(\.|!)[ \t]|(\.$|!)|\n/).first
end
format_trace_flags() 单击以切换源代码

格式化用于显示的跟踪标志。

# File rake-13.2.1/lib/rake/task.rb, line 261
def format_trace_flags
  flags = []
  flags << "first_time" unless @already_invoked
  flags << "not_needed" unless needed?
  flags.empty? ? "" : "(" + flags.join(", ") + ")"
end
transform_comments(separator, &block) 单击以切换源代码

按照块的指定转换注释列表,并使用分隔符连接。

# File rake-13.2.1/lib/rake/task.rb, line 328
def transform_comments(separator, &block)
  if @comments.empty?
    nil
  else
    block ||= lambda { |c| c }
    @comments.map(&block).join(separator)
  end
end