Почему Обстреливать не может вызвать несколько задач последовательно?

У меня есть задача Граблей, которую я упростил ниже. Я использую Ruby 1.9 в Windows.

Возможно, требуется предположить результат вызова задачи Граблей "list_all_levels" ниже? Это должно быть:

"Hello level 1"
"Hello level 2"
"Hello level 3"

Но по причинам, неизвестным мне, это печатает только "Привет уровень 1" и затем останавливается.

Таким образом, это всегда вызывает только первую задачу. Если бы я изменяю первую строку для передачи аргумента "42", это распечатало бы "Привет уровень 42" и затем остановилось бы.

Я задаюсь вопросом, почему это не вызывает времена задачи 3 и печатает все 3 строки? И есть ли какой-либо способ заставить это работать, как я ожидал бы?

task :list_all_levels => [] do
    Rake::Task[:list].invoke 1
    Rake::Task[:list].invoke 2
    Rake::Task[:list].invoke 3
end

task :list, [:level] => [] do |t, args|
    puts "Hello level #{args.level}"
end
37
задан PandaWood 28 March 2010 в 09:30
поделиться

1 ответ

Проблема в том, что invoke вызывает задачу, только если она необходима . Запуск rake --trace показывает:

(in /tmp/ruby)
** Invoke default (first_time)
** Execute default
** Invoke list (first_time)
** Execute list
Hello level 1
** Invoke list 
** Invoke list 

Итак, вы можете видеть, что он пытается вызвать задачу : list еще два раза. Но вы можете изменить текст основной задачи на:

task :default => [] do
    Rake::Task[:list].invoke 1
    Rake::Task[:list].reenable
    Rake::Task[:list].invoke 2
    Rake::Task[:list].reenable
    Rake::Task[:list].invoke 3
end

, тогда снова потребуется задача : list , и она правильно распечатает все 3 оператора.

Более чистый способ сделать это - использовать execute вместо invoke :

task :default => [] do
    Rake::Task[:list].execute 1
    Rake::Task[:list].execute 2
    Rake::Task[:list].execute 3
end

task :list, [:level] => [] do |t, args|
    puts "Hello level #{args}"
end

Это изменяет ваш оператор put на использование только args , а не args.level по какой-то причине. Есть и другие предостережения при использовании execute вместо invoke , описанных в приведенной выше ссылке.

56
ответ дан 27 November 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: