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