Почему Rake не может вызывать несколько задач подряд? - PullRequest
36 голосов
/ 28 марта 2010

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

Возможно, вы хотели бы угадать результат вызова задачи Rake "list_all_levels" ниже? Должно быть:

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

Но по неизвестным мне причинам он печатает только «Hello level 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

Ответы [ 2 ]

55 голосов
/ 28 марта 2010

Проблема в том, что 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

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

6 голосов
/ 05 февраля 2013

Вам нужно повторно включить задачу перед новым выполнением, для этого вам просто нужно выполнить метод reenable. Как упомянул пользователь Марк Рушаков.

Rake::Task[:list].reenable
...