2009-03-24 4 views
5

Al programar en C# utilizando Visual Studio 2008, a menudo deseo la generación de código "automático". Si es posible, me gustaría lograrlo haciendo que mi archivo de la solución MSBuild llame a Rake, que llamaría al código Ruby para la generación del código, haciendo que los archivos generados resultantes aparezcan automáticamente en mi solución.¿Alguien tiene experiencia en llamar a Rake de MSBuild para conocer el código y otros beneficios? ¿Como le fue? ¿Cuáles son tus pensamientos/recomendaciones?

Aquí hay un ejemplo de negocio (de muchos ejemplos posibles que podría nombrar) donde este tipo de generación de código automático sería útil. En un proyecto reciente tuve una interfaz con algunas propiedades que contenían montos en dólares. Quería una segunda interfaz y una tercera que tuviera las mismas propiedades que la primera, a excepción de que estaban "calificadas" con un nombre de unidad comercial. Algo como esto:

public interface IQuarterlyResults 
{ 
    double TotalRevenue { get; set; } 
    double NetProfit { get; set; } 
} 

public interface IConsumerQuarterlyResults 
{ 
    double ConsumerTotalRevenue { get; set; } 
    double ConsumerNetProfit { get; set; } 
} 

public interface ICorporateQuarterResults 
{ 
    double CorporateTotalRevenue { get; set; } 
    double CorporateNetProfit { get; set; } 
} 

En este ejemplo, hay una "Unidad de Negocios de Consumo" y una "unidad de negocio de las empresas". Cada propiedad en IQuarterlyResults se convierte en una propiedad llamada "Corporate" + [nombre de la propiedad] en ICorporateQuarterlyResults, y asimismo para IConsumerQuarterlyResults.

¿Por qué crear interfaces para estos, en lugar de simplemente tener una instancia de IQuarterlyResults for Consumer y otra instancia para Corporate? Porque, al trabajar con el objeto de calculadora que estaba construyendo, el usuario tuvo que lidiar con cientos de propiedades, y es mucho menos confuso si puede tratar con nombres de propiedades "totalmente calificados" como "ConsumerNetProfit".

Pero no nos empantanemos en este ejemplo. Es solo un ejemplo y no la pregunta principal.

La cuestión principal es la siguiente: Me encanta usar Ruby y ERB para la generación de código, y me encanta el uso de rastrillo para gestionar las dependencias entre tareas. Para resolver el problema anterior, lo que me gustaría hacer es hacer que MSBuild llame a Rake, y hacer que Rake/Ruby lea la lista de propiedades en la interfaz "core" y luego generar el código para hacer que todas las interfaces dependientes y sus propiedades. Esto se dispara cada vez que hago una compilación, porque la pongo en el archivo MSBuild para la solución VS.NET.

¿Alguien ha intentado algo como esto? ¿Cómo te funcionó? ¿Qué ideas puedes compartir sobre pros, contras, consejos para el éxito, etc.?

Gracias!

+0

¿Alguien? Bueller? (Me gusta la respuesta de MikeJ, pero estaba usando Nant en lugar de MsBuild). –

Respuesta

1

Lo hicimos con Nant/ruby ​​+ ERB - genera un tono de CRUD en nuestra entrada de formulario de ingreso de datos y DAL para nuestra aplicación web. para nosotros funciona muy bien, pero hubo una buena cantidad de tiempo de preparación al principio que puso nervioso a mi jefe/cliente, porque pensaron que deberíamos mostrar más producción que prototipo.

También asegúrese de lo que está haciendo la generación - hay diferencias entre generar & modificar y generar + integrar. generar & modificar es más parecido a usar un asistente y es uno solo. cuando se genera + integrar, se necesita entender dónde/cómo se explotará el código generado, ya sea a través de la herencia o mediante llamadas a la biblioteca desde el código escrito a mano en el código generado.

Ruby/erb no se ejecuta rápidamente. Un método para determinar cuándo debe/no debe generar es útil porque los ciclos de compilación comienzan a ser largos e improductivos. También encontramos útil construir siempre un pequeño caso de prueba para generar incluso un solo conjunto de artefactos antes de integrarlo en el flujo de trabajo: usted tiene una prueba del producto y no ralentiza a nadie mientras trabaja en el elemento cg (s).)

Leería Jack Herringtons Code Generation in Action como su engranaje hacia Ruby. Me tiene en CG.

Yo también rea Kathleen Dollards Code Generation in Microsoft .NET. Fue construido para usar XSLT pero los principios son los mismos para desarrollar las etapas de metdadata, transformación e integración. Sus artículos también son útiles que puedes encontrar en revistas y en la web.

+0

Gracias. Estoy de acuerdo con saber cuándo no regenerar algo ya que ERB no es rápido. Para eso quiero Rake en la mezcla. Me gustaría expresar las dependencias de las diversas etapas en Rake. Gracias por la info. Todavía espero que alguien lo haya hecho desde MSBuild (pero yo te voté +1). –

+0

Supongo que puede compilar la tarea en msbuild, algo para grabar con mi día libre el viernes. – MikeJ

+0

Ah, ¿trabajas para Google? –

0

Quería simplemente lanzar esto por ahí (aunque dudo que sea una respuesta a la pregunta, debería ir a la información), pero hay un par de buenas herramientas CodeGen que tienen algunas integraciones de Visual Studio bastante fuertes que puede hacer mucho de lo que quiere Obviamente que busca una herramienta de Ruby, pero para aquellos que por ahí que no se sienten cómodos con Ruby, tenga en cuenta algunas de las otras herramientas:

1

utilizo rastrillo para generar archivos de configuración que están modelados usando ERB. Lo que hay que hacer es editar el archivo de proyecto para insertar un objetivo BeforeBuild que llama rastrillo, similar a:

<Target Name="BeforeBuild"> 
    <Exec Command="rake name_of_my_template_processing_task" /> 
</Target> 

Ver msbuild exec task docs y a blog post on pre-build events. Es necesario en el atributo de comandos para:

  • proporcionar la ruta en el rastrillo si no es en la variable de entorno de la ruta ya
  • establecer el atributo de directorio de trabajo si lo necesita para ejecutarse desde un directorio en particular
  • suministro a -r argumento y la ruta al rakefile si no está ejecutando rake desde el directorio en el que se encuentra su proyecto.
Cuestiones relacionadas