Как я могу иметь вспомогательные функции с тем же именем в разных задачах rake? Следующий код не работает:rake namespace vs. ruby module
# bar.rake
namespace :bar do
desc 'bar'
task :bar => :environment do
bar
end
def bar
puts "bar bar"
end
end
# foo.rake
namespace :foo do
desc 'bar'
task :bar => :environment do
bar
end
def bar
puts "foo bar"
end
end
(неправильно) Результат:
$ rake bar:bar
foo bar
Это потому, что пространство имена Грабель не работает, как модуль Ruby, поэтому функция бара во 2-й задаче переопределяет бар функции 1-й задачи.
Итак, какое хорошее решение имеет локальные вспомогательные функции в рейк-задачах?
Ну, вы можете обернуть пространство имен в модуле. – BroiSatse
Это не работает. Обертка всего в модуле приводит к: 'NoMethodError: undefined method 'namespace' для Foo: Module'. И оставляя пространство имен вне модуля, таким образом, только обертывая все внутри пространства имен в модуле, выдает «NoMethodError: undefined method« desc »для Foo: Module'. Поэтому я думаю, что рейк-задачи не могут быть в модуле. Я могу поместить свою вспомогательную функцию в модуль, но мне нужно будет вызвать бар с явным пространством имен (Foo :: bar в foo.rake и Bar :: bar в bar.rake). – thorstenhirsch
вместо 'модуля Foo' try,' Module.new do'. Это будет оценивать блок внутри контекста анонимного модуля, не нарушая область поиска метода. – BroiSatse