Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么Rake不能连续调用多个任务?_Ruby_Rake_Task - Fatal编程技术网

Ruby 为什么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”,然后停止 我想知道为什么它不调用任务三次并打印所有三行? 有没

我有一个Rake任务,我在下面简化了它。 我在Windows上使用Ruby 1.9

也许您想猜测下面调用Rake任务“列出所有级别”的结果?应该是:

"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