为什么Rake不能连续调用多个任务?

Pan*_*ood 37 ruby rake task

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

也许您想猜测下面调用Rake任务"list_all_levels"的结果?它应该是:

"Hello level 1"
"Hello level 2"
"Hello level 3"
Run Code Online (Sandbox Code Playgroud)

但由于我不知道的原因,它只打印"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
Run Code Online (Sandbox Code Playgroud)

Mar*_*off 56

问题是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
Run Code Online (Sandbox Code Playgroud)

然后: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
Run Code Online (Sandbox Code Playgroud)

这会改变你的puts陈述,args而不是args.level出于某些原因.在上面的链接中描述了一些使用execute过的警告invoke.

  • 如果将它改为`execute` @PandaWood则要小心,因为它们不完全相同=> [rake execute vs invoke](http://chrisroos.co.uk/blog/2007-12-06-ruby-rake-调用-VS-执行) (3认同)
  • @marcovtwout因为Rake最初是为了取代Make而构建的,其目的是避免重复编译.它看起来非常直观. (2认同)

Scu*_*tti 7

您需要在新执行之前重新启用任务,为此,您只需要执行reenable方法.就像用户Mark Rushakoff所说的那样.

Rake::Task[:list].reenable
Run Code Online (Sandbox Code Playgroud)