У меня есть небольшая, но растущая среда для построения систем .net с ruby / rake , над которой я работаю некоторое время. В этой кодовой базе у меня есть следующее:
require 'rake/tasklib'
def assemblyinfo(name=:assemblyinfo, *args, &block)
Albacore::AssemblyInfoTask.new(name, *args, &block)
end
module Albacore
class AssemblyInfoTask < Albacore::AlbacoreTask
def execute(name)
asm = AssemblyInfo.new
asm.load_config_by_task_name(name)
call_task_block(asm)
asm.write
fail if asm.failed
end
end
end
шаблон, которому следует этот код, повторяется примерно 20 раз в рамках. Разница в каждой версии заключается в имени создаваемого / вызываемого класса (вместо AssemblyInfoTask, это может быть MSBuildTask или NUnitTask) и содержимом метода execute. Каждая задача имеет собственную реализацию метода execute.
Я постоянно исправляю ошибки в этом шаблоне кода, и мне приходится повторять исправление 20 раз, каждый раз, когда мне нужно исправление.
Я знаю, что можно сделать некоторую магию метапрограммирования и подключить этот код для каждой из моих задач из одного места ... но мне действительно тяжело заставить его работать.
моя идея в том, что я хочу иметь возможность вызывать что-то вроде этого:
create_task :assemblyinfo do |name|
asm = AssemblyInfo.new
asm.load_config_by_task_name(name)
call_task_block(asm)
asm.write
fail if asm.failed
end
и это соединит все, что мне нужно.
Мне нужна помощь! советы, предложения, кто-то, кто хочет заняться этим ... как мне избежать повторения этого шаблона кода снова и снова?
Обновление: Вы можете получить полный исходный код здесь: http://github.com/derickbailey/Albacore/ предоставленный код /lib/rake/assemblyinfotask.rb