在命名空间之外执行任务

时间:2015-01-06 18:39:17

标签: ruby-on-rails ruby rake rakefile

我有一个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

我错过了什么?

1 个答案:

答案 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