2015-01-06 5 views
5

У меня есть файл рейк настроить таким образом: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, это неожиданно, как указано здесь:

При поиске имени задачи, рейк начнется с текущего пространства имен и попытается найти там имя. Если он не найдет имя в текущем пространстве имен, он будет искать родительские пространства имен до тех пор, пока не будет найдено совпадение (или возникнет ошибка, если нет совпадения).

Не предполагал, что грабли начнутся в текущем пространстве имен, а затем перейдут к поиску чего-либо. В моем примере я не предоставляю текущий файл имен, но он перескакивает на setup, хотя все, что я дал, было run.

Что мне не хватает?

ответ

4

Строка puts "I'm in setup" не является частью какой-либо задачи - она ​​будет выполнена независимо от заданной вами задачи, даже несуществующей, поскольку файл обрабатывается (строго говоря, когда Ruby не анализирует файл, а как она выполняется и настройка задач рейк):

$ 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 
+1

Понял - спасибо матовый, имеет смысл. – Anthony

Смежные вопросы