模块 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