Задание 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

Из того, что я могу сказать в руководствах, это неожиданно, как указано здесь:

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

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

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

1 ответ

Решение

Линия 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
Другие вопросы по тегам