在命名空间之外执行任务

Ant*_*ony 5 ruby rake ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

如果我跑,rake setup:create我得到预期的:

I'm in setup
I'm in create
Run Code Online (Sandbox Code Playgroud)

但是,如果我跑,rake run我得到:

I'm in setup
I'm in run
Run Code Online (Sandbox Code Playgroud)

从我在指南中可以看出,这是出乎意料的,如下所述:

查找任务名称时,rake将从当前命名空间开始,并尝试在那里找到该名称.如果它无法在当前命名空间中找到名称,它将搜索父命名空间,直到找到匹配项(如果没有匹配项则发生错误).

不会假设rake从当前命名空间开始,然后继续寻找某些东西.在我的例子中,我没有提供当前的名称,但它跳进去setup,尽管我给的是它run.

我错过了什么?

mat*_*att 5

该行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)
Run Code Online (Sandbox Code Playgroud)

只有在读取文件后才会进行任务查找,这就是引用所指的内容。

如果你想要一个命名空间的所有任务的通用代码,你需要为它创建一个任务并使命名空间中的所有其他任务依赖它,例如:

namespace :setup do
  task :create => :default do
    puts "I'm in create"
  end

  task :default do
    puts "I'm in setup"
  end
end
Run Code Online (Sandbox Code Playgroud)