2009-10-28 5 views
5

Estoy generando bastante código desde un único archivo XML, pero las plantillas están organizadas en dos plantillas T4 diferentes. Cada vez que cambio el archivo XML, debo recordar abrir los dos archivos *.tt, cambiarlos trivialmente (agregar/eliminar un espacio) y guardarlos nuevamente para asegurarme de que se genere el código.Cómo forzar a Visual Studio 2008 a regenerar el código de las plantillas T4 cuando cambia un archivo XML?

¡Esta no puede ser la manera correcta de hacerlo!

Idealmente, me gustaría que Visual Studio 2008 realice una transformación de texto en los archivos T4 si el archivo XML ha cambiado. Estoy un poco perdido ya que realmente no sé cómo Visual Studio construye proyectos de C#, por lo que los punteros en esa dirección también serían de ayuda (podría intentar resolverlo yo mismo).

+0

Por cierto: descubrí que Visual Studio construye proyectos de C#: MSBuild. El archivo de proyecto en sí (* .csproj) es un archivo MSBuild, similar a un Makefile. Entonces, una solución podría ser tocar los archivos * .tt al "construir" el archivo XML ... Te mantendré informado. –

Respuesta

2

Puede usar T4ScriptFileGenerator desde T4Toolbox como una herramienta personalizada para su archivo XML. Supongamos que tiene el archivo Test.XML en su proyecto con esta herramienta personalizada. La primera vez que se guarda Test.XML, esta herramienta personalizada crea un nuevo archivo Test.tt. Puede colocar su lógica de generación de código allí (en su lugar, o #include sus otros archivos .tt). La próxima vez que guarde Test.XML, se transformará (generará código) el Test.tt existente.

2

Creo que finalmente pude haber encontrado una solución aquí. Obtuve la idea al explorar cómo se mencionan los archivos XAML en el archivo del proyecto para los proyectos de C#.

Vamos a suponer un archivo A.tt y B.tt que utilizan datos de C.xml y nos gustaría para regenerar el código cada vez que C.xml cambios.

Edite el archivo del proyecto. Sus definiciones para A.tt y B.tt debe ser algo como esto:

<ItemGroup> 
    <None Include="A.tt"> 
     <Generator>TextTemplatingFileGenerator</Generator> 
     <LastGenOutput>A.cs</LastGenOutput> 
     <DependentUpon>C.xml</DependentUpon> 
    </None> 
    <None Include="B.tt"> 
     <Generator>TextTemplatingFileGenerator</Generator> 
     <LastGenOutput>B.cs</LastGenOutput> 
     <DependentUpon>C.xml</DependentUpon> 
    </None> 
</ItemGroup> 

Además, se necesita (por supuesto ...)

<ItemGroup> 
    <None Include="C.xml" /> 
</ItemGroup> 

Y también la instrucción para autogenerar A.cs y B.cs:

<Compile Include="A.cs"> 
     <DependentUpon>A.tt</DependentUpon> 
     <AutoGen>True</AutoGen> 
     <DesignTime>True</DesignTime> 
</Compile> 
<Compile Include="B.cs"> 
     <DependentUpon>B.tt</DependentUpon> 
     <AutoGen>True</AutoGen> 
     <DesignTime>True</DesignTime> 
</Compile> 

Creo que la mayoría de esto ya estará hecho para usted cuando cree el archivo de plantilla, por lo que todo lo que tiene que d es <DependentUpon>C.xml</DependentUpon> partes a ItemGroup s para A.tt y B.tt.

+1

Tendría mucho sentido si esto fuera correcto. Lamentablemente no es :(- DependentUpon aparentemente solo se usa con fines de presentación en la vista de árbol del proyecto. – Ibmurai

+0

@Ibmurai, sí, eso también lo encontré ... Simplemente no tenía ninguna prueba definitiva y seguí adelante. Gracias para señalar esto! –

+0

No creo que eso funcione. – Slion

Cuestiones relacionadas