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.
我错过了什么?
该行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)
| 归档时间: |
|
| 查看次数: |
416 次 |
| 最近记录: |