Грабли: как вывести список задач изнутри задачи? - PullRequest
16 голосов
/ 30 апреля 2011

Мне бы хотелось, чтобы моя задача: default в Rakefile была полезным сообщением, которое также включает список доступных задач (вывод rake -T) для людей, которые не так хорошо знакомы с rake.

Как вызвать rake -T из задачи?

Ответы [ 3 ]

12 голосов
/ 04 июля 2012

Вызов 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

может быть более подходящим.

Оба работают для меня, используя рейк 0.9.2.2.

2 голосов
/ 01 мая 2011

Nevermind. Я нашел ответ, как только нашел правильный метод.

В дополнение к вызову display_tasks_and_comments вы также должны установить регулярное выражение для фильтрации задач, которые хотите показать, или по умолчанию оно отфильтрует их все.

Чтобы сделать задачу по умолчанию выводом rake -T, используйте следующее:

task :default do
  Rake.application.options.show_task_pattern = //
  Rake.application.display_tasks_and_comments()
end
0 голосов
/ 16 февраля 2017

Это сложнее, чем нужно многим людям, но эта программа будет извлекать задачи rake из других файлов rake БЕЗ, включая другие файлы rakefile.Я использовал его как часть задачи 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

Полный код на

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...