class Rake::Task
Task
是 Rakefile 中工作的基本单元。任务具有关联的动作(可能不止一个)和先决条件列表。当调用时,任务将首先确保其所有先决条件都有机会运行,然后它将执行自己的动作。
通常不使用 new 方法直接创建任务,而是使用 file
和 task
便利方法。
属性
附加到任务的动作列表。
此任务是否已被调用? 除非重新启用它们,否则将跳过已调用的任务。
拥有此任务的 Application
。
此任务的每个任务定义的文件/行位置(仅当任务定义时设置了检测位置选项时才有效)。
任务的仅顺序先决条件列表。
任务的先决条件列表。
任务的先决条件列表。
用于此任务查找的嵌套命名空间名称的数组。
任务的来源列表。
公共类方法
返回具有给定名称的任务。 如果当前不知道该任务,请尝试从定义的规则中合成一个。 如果找不到规则,但是现有文件与任务名称匹配,则假定它是没有依赖项或操作的文件任务。
# File rake-13.2.1/lib/rake/task.rb, line 404 def [](task_name) Rake.application[task_name] end
清除任务列表。 这会导致 rake 立即忘记已分配的所有任务。(通常在单元测试中使用。)
# File rake-13.2.1/lib/rake/task.rb, line 391 def clear Rake.application.clear end
定义一个用于合成任务的规则。
# File rake-13.2.1/lib/rake/task.rb, line 421 def create_rule(*args, &block) Rake.application.create_rule(*args, &block) end
给定 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
格式化传递给任务的依赖项参数。
# 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
创建一个名为 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
根据此类任务的规则,将作用域应用于任务名称。 通用任务将接受作用域作为名称的一部分。
# 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
如果已经定义了任务名称,则为 TRUE。
# File rake-13.2.1/lib/rake/task.rb, line 409 def task_defined?(task_name) Rake.application.lookup(task_name) != nil end
所有已定义任务的列表。
# File rake-13.2.1/lib/rake/task.rb, line 396 def tasks Rake.application.tasks end
公共实例方法
向任务添加描述。 描述可以由可选的参数列表(用括号括起来)和一个可选的注释组成。
# 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
所有唯一的先决条件任务列表,包括先决条件任务的先决条件。 当发现循环依赖项时,包括自身。
# File rake-13.2.1/lib/rake/task.rb, line 77 def all_prerequisite_tasks seen = {} collect_prerequisites(seen) seen.values end
此任务的参数名称。
# File rake-13.2.1/lib/rake/task.rb, line 141 def arg_names @arg_names || [] end
清除 rake 任务的现有先决条件,操作,注释和参数。
# File rake-13.2.1/lib/rake/task.rb, line 153 def clear clear_prerequisites clear_actions clear_comments clear_args self end
清除 rake 任务上的现有操作。
# File rake-13.2.1/lib/rake/task.rb, line 168 def clear_actions actions.clear self end
清除 rake 任务上的现有参数。
# File rake-13.2.1/lib/rake/task.rb, line 180 def clear_args @arg_names = nil self end
清除 rake 任务上的现有注释。
# File rake-13.2.1/lib/rake/task.rb, line 174 def clear_comments @comments = [] self end
清除 rake 任务的现有先决条件。
# File rake-13.2.1/lib/rake/task.rb, line 162 def clear_prerequisites prerequisites.clear self end
所有注释的第一行(或句子)。 多个注释用“/”分隔。
# File rake-13.2.1/lib/rake/task.rb, line 322 def comment transform_comments(" / ") { |c| first_sentence(c) } end
使用先决条件或操作增强任务。 返回 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
执行与此任务关联的操作。
# 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
完整注释集合。 多个注释用换行符分隔。
# File rake-13.2.1/lib/rake/task.rb, line 316 def full_comment transform_comments("\n") end
返回描述任务内部状态的字符串。 用于调试。
# 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
如果需要,则调用该任务。 先调用先决条件。
# 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
任务的名称,包括任何命名空间限定符。
# File rake-13.2.1/lib/rake/task.rb, line 122 def name @name.to_s end
是否需要此任务?
# File rake-13.2.1/lib/rake/task.rb, line 286 def needed? true end
先决条件任务列表
# File rake-13.2.1/lib/rake/task.rb, line 61 def prerequisite_tasks (prerequisites + order_only_prerequisites).map { |pre| lookup_prerequisite(pre) } end
重新启用任务,如果再次调用任务,则允许执行其任务。
# File rake-13.2.1/lib/rake/task.rb, line 147 def reenable @already_invoked = false @invocation_exception = nil end
设置此任务的参数名称。 args
应该是一个符号数组,每个参数名称一个。
# File rake-13.2.1/lib/rake/task.rb, line 348 def set_arg_names(args) @arg_names = args.map(&:to_sym) end
来自规则的第一个来源(如果没有来源则为 nil)
# File rake-13.2.1/lib/rake/task.rb, line 93 def source sources.first end
# File rake-13.2.1/lib/rake/task.rb, line 52 def sources if defined?(@sources) @sources else prerequisites end end
此任务的时间戳。 基本任务返回其时间戳的当前时间。 其他任务可能更复杂。
# File rake-13.2.1/lib/rake/task.rb, line 292 def timestamp Time.now end
返回任务名称
# File rake-13.2.1/lib/rake/task.rb, line 42 def to_s name end
添加仅顺序依赖项。
# File rake-13.2.1/lib/rake/task.rb, line 379 def |(deps) @order_only_prerequisites |= Task.format_deps(deps) - @prerequisites self end
受保护的实例方法
与 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
私有实例方法
获取字符串中的第一个句子。 该句子由第一个句点,感叹号或行尾终止。 小数点不算作句点。
# File rake-13.2.1/lib/rake/task.rb, line 341 def first_sentence(string) string.split(/(?<=\w)(\.|!)[ \t]|(\.$|!)|\n/).first end
格式化用于显示的跟踪标志。
# 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
按照块的指定转换注释列表,并使用分隔符连接。
# 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