我有一个Rake任务,我在下面简化了。 我在Windows上使用Ruby 1.9。
也许您想猜测下面调用Rake任务“list_all_levels”的结果?它应该是:
"Hello level 1"
"Hello level 2"
"Hello level 3"
但由于我不知道的原因,它只打印“Hello level 1”然后停止。
也就是说,它总是只调用第一个任务。 如果我更改第一行以传递arg“42”,它将打印“Hello level 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
答案 0 :(得分:55)
问题是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个语句。
更简洁的方法是use execute
rather than 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
还有其他一些注意事项。
答案 1 :(得分:6)
您需要在新执行之前重新启用任务,为此,您只需要执行方法reenable。就像用户Mark Rushakoff所说的那样。
Rake::Task[:list].reenable