Я унаследовал проект с множеством плохо написанных Rake-задач, которые мне нужно немного очистить. Поскольку Rake-файлы огромны и часто склонны к причудливым бессмысленным зависимостям, я упрощаю и изолирую вещи, переводя все в классы.
В частности, этот шаблон выглядит следующим образом:
namespace :foobar do
desc "Frozz the foobar."
task :frozzify do
unless Rake.application.lookup('_frozzify')
require 'tasks/foobar'
Foobar.new.frozzify
end
Rake.application['_frozzify'].invoke
end
# Above pattern repeats many times.
end
# Several namespaces, each with tasks that follow this pattern.
В tasks/foobar.rb
у меня есть что-то похожее на это:
class Foobar
def frozzify()
# The real work happens here.
end
# ... Other tasks also in the :foobar namespace.
end
Для меня это замечательно, потому что позволяет мне отделить зависимости задачи друг от друга и полностью переместить их в другое место, и я смог радикально упростить вещи и изолировать зависимости. Rakefile не достигает require
, пока вы не попытаетесь запустить задачу. Раньше это вызывало серьезные проблемы, потому что вы не могли даже перечислить задачи без их взрыва.
Моя проблема в том, что я очень часто повторяю эту идиому. Обратите внимание на следующие шаблоны:
Для каждого пространства имен :xyz_abc
в файле tasks/[namespace].rb
имеется соответствующий класс *1019* с именем класса, которое выглядит как XyzAbc
.
Для каждой задачи в определенном пространстве имен в связанном классе пространства имен есть метод с одинаковым именем. Например, если у пространства имен :foo_bar
есть задача :apples
, вы ожидаете увидеть def apples() ...
внутри класса FooBar
, который сам по себе находится в tasks/foo_bar.rb
.
Каждая задача :t
определяет «мета-задачу» _t
(то есть имя задачи с префиксом подчеркивания), которая используется для выполнения фактической работы.
Я все еще хочу иметь возможность указать desc
-описание для задач, которые я определяю, и это будет отличаться для каждой задачи. И, конечно, у меня есть небольшое количество задач, которые вообще не следуют вышеуказанному шаблону, поэтому я буду указывать их вручную в моем Rakefile.
Я уверен, что это можно каким-то образом реорганизовать, чтобы мне не приходилось повторять одну и ту же идиому снова и снова, но мне не хватает опыта, чтобы понять, как это можно сделать. Может ли кто-нибудь оказать мне помощь?