Tengo un marco pequeño pero creciente para building .net systems with ruby/rake, en el que he estado trabajando desde hace un tiempo. En esta base de código, tengo el siguiente:¿Cómo puedo convertir este código a meta-programación, así puedo dejar de duplicarlo?
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
el patrón que este código sigue se repite alrededor de 20 veces en el marco. La diferencia en cada versión es el nombre de la clase que se está creando/llamando (en lugar de AssemblyInfoTask, puede ser MSBuildTask o NUnitTask) y el contenido del método de ejecución. Cada tarea tiene su propia implementación de método de ejecución.
Estoy constantemente arreglando errores en este patrón de código y tengo que repetir la corrección 20 veces, cada vez que necesito una solución.
Sé que es posible hacer magia de meta-programación y conectar este código para cada una de mis tareas desde una única ubicación ... pero me está costando trabajo hacerlo funcionar.
mi idea es que quiero ser capaz de llamar a algo como esto:
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
y esto iba a cablear todo lo que necesito.
¡Necesito ayuda! consejos, sugerencias, alguien dispuesto a abordar esto ... ¿cómo puedo evitar tener que repetir este patrón de código una y otra vez?
Actualización: Puede obtener el código fuente completo aquí: http://github.com/derickbailey/Albacore/ el código proporcionado es /lib/rake/assemblyinfotask.rb
+1 para usar Github, es muy bueno poder navegar por toda la fuente. – Xorlev
¿Por qué no colocas todas las definiciones de clases en el archivo del módulo? El enfoque de metaprogramación solo le ahorra 1 línea de código real (no "final"), a cambio de una ofuscación adicional. A menos que necesite definir dinámicamente las tareas, solo usaría el enfoque de vanilla. – klochner
. . . a menos que, por supuesto, este sea un ejercicio de aprendizaje más que un proyecto terminado. – klochner