Ruby 为什么Rake不能连续调用多个任务?
我有一个Rake任务,我在下面简化了它。 我在Windows上使用Ruby 1.9 也许您想猜测下面调用Rake任务“列出所有级别”的结果?应该是:Ruby 为什么Rake不能连续调用多个任务?,ruby,rake,task,Ruby,Rake,Task,我有一个Rake任务,我在下面简化了它。 我在Windows上使用Ruby 1.9 也许您想猜测下面调用Rake任务“列出所有级别”的结果?应该是: "Hello level 1" "Hello level 2" "Hello level 3" 但由于我不知道的原因,它只打印“Hello level 1”,然后停止 也就是说,它总是只调用第一个任务。 如果我将第一行更改为通过arg“42”,它将打印“Hello level 42”,然后停止 我想知道为什么它不调用任务三次并打印所有三行? 有没
"Hello level 1"
"Hello level 2"
"Hello level 3"
但由于我不知道的原因,它只打印“Hello level 1”,然后停止
也就是说,它总是只调用第一个任务。
如果我将第一行更改为通过arg“42”,它将打印“Hello level 42”,然后停止
我想知道为什么它不调用任务三次并打印所有三行?
有没有办法让它像我期望的那样工作
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
问题在于,只有在需要时才调用任务。运行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
任务,并正确打印出所有3条语句
更干净的方法是:
由于某种原因,
将语句改为只使用args
而不是args.level
。使用上面链接中描述的execute
而不是invoke
还有一些其他注意事项。您需要在新执行之前重新启用任务,为此,您只需要执行可重新启用的方法。就像MarkRushakoff提到的用户一样
Rake::Task[:list].reenable
如果将其更改为execute
@PandaWood,请小心,因为它们并不完全相同=>这对我来说似乎非常违反直觉。知道他们为什么这样做吗?@marcovtwout因为Rake最初是用来取代Make的,Make的目的是避免重复编译。我觉得这很直观。
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
Rake::Task[:list].reenable