我有一个Rake任务,我在下面简化了它.

也许您想猜一下下面将Rake任务称为"列出所有级别"的结果?应该是:

"Hello level 1"
"Hello level 2"
"Hello level 3"

但由于我不知道的原因,它只打印"Hello level 1",然后停止.

也就是说,它总是只调用第一个任务.

我想知道为什么它会调用任务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

推荐答案

问题是,如果invokeneeded,它只会调用任务.运行rake --trace显示:

(in /tmp/ruby)
** Invoke default (first_time)
** Execute default
** Invoke list (first_time)
** Execute list
Hello level 1
** Invoke list 
** Invoke list 

因此,您可以看到它正在try 再次调用Task: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条语句.

更干净的方法是:

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.在上面的链接中,使用executeinvoke还有一些其他的注意事项.

Ruby相关问答推荐

有没有办法保存 ruby​​ 代码的执行,以便稍后使用逐步重播对其进行调试?

警告 Selenium [弃用] Manager#logs 已弃用.使用 Chrome::Driver#logs 代替

在 ruby​​ 中提取文档中的主题标签和部分

从 URL 字符串中提取主机的 Ruby 代码

用于 ruby​​ gems 的新 10.9 OSX 的命令行工具?

如何通过 Rack 提供静态文件?

在基于值的哈希数组上唯一

如何使用 if..else 块的结果分配变量?

Ruby 中的 Fail vs. raise:我们真的应该相信风格指南吗?

osx bash上的树命令

Rails:Date.today 是 UTC 吗?

Ruby 中的 main是什么?

迭代一个数组,一次 n 项

Ruby:更新哈希值的最简单方法是什么?

Sinatra 登录?

如何使用 RVM 更新 Ruby 解释器?

相当于 Ruby 的 cURL?

检索/列出 Redis 数据库中的所有键/值对

让 sidekiq 立即执行作业(job)

为什么 Ruby 有 TrueClass 和 FalseClass 而不是一个布尔类?