c# - template - Cómo deshabilitar las directivas#line que se escriben en el archivo de salida de la generación T4
t4 templates tutorial (2)
He encontrado un pequeño problema con mi generación de código T4.
He dividido mis plantillas T4 en archivos separados y los he colocado en varios directorios. He hecho esto para que algunas partes de mi generación de código puedan reutilizarse en múltiples proyectos, por ejemplo, generación de modelos, generación de repositorios y generación de servicios, todos incluyen una EntityGeneration central archivo .tt.
Desafortunadamente, cuando TextTemplating resuelve mis inclusiones anidadas, genera una directiva larga de preprocesador #line en su archivo .cs generado, combinando todas las rutas relativas al archivo incluido de nivel más bajo.
Desafortunadamente, como esta ruta se construye con rutas relativas, termina innecesariamente larga, de hecho, en realidad supera la longitud máxima de la ruta (Windows 7).
Aquí está la línea de falla del código generado en caso de que esté interesado:
#line 3 "C:/VS2010/AlbatrossTravelGroup/ASC/AlbatrossTravelGroup.ASC.BusinessRules/Services/Contracts/../../../../AlbatrossTravelGroup.BusinessRules/Services/Contracts/../../../AlbatrossTravelGroup.Models/Repositories/Contracts/../../../AlbatrossTravelGroup.Common/CodeGeneration.tt"
Mi pregunta es esta: ¿cómo puedo deshabilitar la escritura de estas directivas en el archivo de código generado? Si eso falla, ¿cómo puedo evitar este problema sin cambiar la estructura de mi archivo?
No estoy seguro de que esto solucionará tu problema. No tengo mucha experiencia con T4. Dicho esto, lo estoy usando para construir varios archivos en mi proyecto y no me he encontrado con el problema con el que se está encontrando.
En mi caso, tengo un montón de archivos .tt individuales que representan archivos individuales en mi proyecto.
La forma en que lo hago es la siguiente: tengo un método SaveOutput (robado de algún lugar en , creo):
void SaveOutput(string outputFileName)
{
if (!string.IsNullOrEmpty(outputFileName))
{
string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
string outputFilePath = Path.Combine(templateDirectory, outputFileName);
string output = this.GenerationEnvironment.ToString();
File.WriteAllText(outputFilePath, output);
}
this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);
}
Así que en mi archivo .tt principal, tengo <# @ incluye ... #> para mis diversos archivos .tt para los archivos individuales. Por ejemplo: <# @ include file = "DataObjectInterface.tt" #>
<#+
public string GenerateInterfaceDataObject(sqlTable table)
{
string ifaceName = "I" + table.ObjectName;
if (table.GenerateInterfaceObjectAsBase)
{
ifaceName += "Base";
}
#>
using System;
namespace <#= InterfaceNamespace #>
{
public interface <#= ifaceName #>
{
<#+
foreach(sqlColumn col in table.Columns)
{
#>
<#= GetColumnCSharpDataType(col) #> <#= col.FieldName #> { get; }
<#+
}
#>
}
}
<#+
return RootPath + @"/AutoGenerated/" + ifaceName + ".cs";
}
#>
Luego, en mi clase principal .tt, simplemente hago una llamada como esta:
string filePath = GenerateInterfaceDataObject(table);
SaveOutput(filePath);
No estoy seguro si este método de dividir tus plantillas funcionará para tus necesidades, pero funcionó para la mía y aún no he tenido ningún problema con eso.
Debo aclarar que mi archivo .tt principal no genera nada de sí mismo. No es en sí misma una plantilla. Simplemente carga cada una de las plantillas y genera los archivos de las otras plantillas.
Visual Studio 2012 agrega la linePragmas="false"
:
<#@ template language="C#" linePragmas="false" #>
http://msdn.microsoft.com/en-us/library/gg586945(v=vs.110).aspx
Todavía no estoy seguro de cómo hacer esto en VS2010, con el que me quedo atascado en el trabajo.