У меня есть задача Граблей, которую я упростил ниже. Я использую 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
Проблема в том, что 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
, описанных в приведенной выше ссылке.