Проблема в том, что 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
, описанных в ссылке выше.