Rake:如何从任务中输出任务列表?

时间:2011-04-30 19:58:09

标签: ruby rake

我希望我的:Rakefile中的默认任务是一个有用的消息,其中还包括不熟悉rake的人的可用任务列表(rake -T的输出)。

如何从任务中调用rake -T?

3 个答案:

答案 0 :(得分:12)

在较新版本的rake中,从任务中调用rake -T会有点复杂。需要设置的选项可以从方法rake/lib/application.rb中的standard_rake_options派生。基本上归结为

Rake::TaskManager.record_task_metadata = true

task :default do
  Rake::application.options.show_tasks = :tasks  # this solves sidewaysmilk problem
  Rake::application.options.show_task_pattern = //
  Rake::application.display_tasks_and_comments
end

请注意,record_task_metadata无法在默认任务中设置,因为在执行任务时已经太晚了(描述将不会被收集,因此这些都是零,因此没有任务匹配图案)。尝试从任务中重新加载Rakefile将导致闭环。我假设在总是收集元数据时有性能交易。如果这是一个问题

task :default do
  system("rake -sT")  # s for silent
end

可能更合适。

使用rake 0.9.2.2对我起作用。

答案 1 :(得分:2)

没关系。一旦找到正确的方法,我就找到了答案。

除了调用display_tasks_and_comments之外,您还必须设置正则表达式来过滤您想要显示的任务,或者默认情况下会将它们全部过滤掉。

要使默认任务输出rake -T,请使用以下命令:

task :default do
  Rake.application.options.show_task_pattern = //
  Rake.application.display_tasks_and_comments()
end

答案 2 :(得分:0)

这比很多人需要的更复杂,但是这个程序将从其他rake文件中提取rake任务而不包括那些其他rakefiles。我使用它作为rake任务的一部分,需要验证其他rakefiles。

主要班级

class RakeBrowser
  attr_reader :tasks
  attr_reader :variables
  attr_reader :loads
  @last_description = ''
  @namespace = ''

  include Rake::DSL

  def desc(description)
    @last_description = description
  end

  def namespace(name=nil, &block) # :doc:
    old = @namespace
    @namespace = "#{name}:#{@namespace}"
    yield(block)
    @namespace = old
  end

  def task(*args, &block)
    if args.first.respond_to?(:id2name)
      @tasks << "#{@namespace}" + args.first.id2name
    elsif args.first.keys.first.respond_to?(:id2name)
      @tasks << "#{@namespace}" + args.first.keys.first.id2name
    end
  end

  def load(filename)
    @loads << filename
  end

  def initialize(file)
    @tasks = []
    @loads = []
    Dir.chdir(File.dirname(file)) do
      eval(File.read(File.basename(file)))
    end
    @variables = Hash.new
    instance_variables.each do |name|
      @variables[name] = instance_variable_get(name)
    end
  end
end

实施

desc "Show all the tasks"
task :default do
  browser = RakeBrowser.new('common.rake')

  browser.tasks.each do |task|
    puts "  " + task
  end
end

完整代码位于