我有一个rake文件设置如下:
require 'rake'
namespace :setup do
puts "I'm in setup"
task :create do
puts "I'm in create"
end
end
task :run do
puts "I'm in run"
end
如果我运行rake setup:create
,我会得到预期的结果:
I'm in setup
I'm in create
但是,如果我运行rake run
,我会:
I'm in setup
I'm in run
据我所知in the guides,这是出乎意料的,如下所述:
查找任务名称时,rake将从当前名称开始 命名空间并尝试在那里找到名称。如果找不到 在当前命名空间中,它将搜索父命名空间 直到找到匹配(如果没有匹配则发生错误)。
不会假设rake从当前命名空间开始,然后继续寻找某些东西。在我的示例中,我没有提供当前的姓名,但它跳转到setup
,即使我提供的只是run
。
我错过了什么?
答案 0 :(得分:4)
行puts "I'm in setup"
不是任何任务的一部分 - 它将被执行你指定的任何任务,即使是一个不存在的任务,因为正在解析文件(严格来说,当Ruby正在解析文件时) ,但正在执行并设置rake任务):
$ rake foo
I'm in setup
rake aborted!
Don't know how to build task 'foo'
(See full trace by running task with --trace)
只有在读取文件后才会进行任务查找,这就是引用引用的内容。
如果你想要一个命名空间的所有任务的公共代码,你需要为它创建一个任务,并使命名空间中的所有其他任务依赖于它,例如:
namespace :setup do
task :create => :default do
puts "I'm in create"
end
task :default do
puts "I'm in setup"
end
end