c# .net visual-studio t4

c# - La acción de compilación del archivo generado(por T4) se restablece para compilar



.net visual-studio (2)

Tenemos un proyecto de base de datos en Visual Studio 2013. En este proyecto tenemos un archivo .tt que genera un script .sql. El problema es que después de la generación, la acción de compilación del archivo generado se configura automáticamente como Generar. Si lo cambiamos manualmente a Ninguno, se restablece a Generar después de regenerarse (ejecutando una herramienta personalizada).

Otra cosa extraña es que solo sucede si el archivo .tt está en el proyecto de la base de datos y en alguna carpeta de ese proyecto (no en la raíz). Si el archivo .tt está en otro proyecto (en cualquier lugar) o en la raíz del proyecto de la base de datos, la acción de compilación del archivo generado no cambia después de la regeneración.

No tenemos ningún complemento de Visual Studio e intenté deshabilitar todas las extensiones y actualizaciones que podrían estar deshabilitadas.

Te daré cualquier detalle si es necesario.


¿Cómo se almacena la acción de compilación? En el csproj Nota: compile el archivo de clase generada con una acción de compilación de Compile

Nota: Compile el valor de valor de valor generado con una acción de compilación de Ninguno

Así que ahora para configurarlo en Ninguno.

Ok, una plantilla T4 que cambia el sqlproj. Nota: Esto es guardar un archivo nuevo para sqlproj en lugar de escribir sobre su sqlproj existente como deseará, como mínimo:

  1. Copia de seguridad de su sqlproj
  2. Prueba en un nuevo archivo
  3. Modifique esto para hacer una copia de seguridad del sqlproj por si acaso.
  4. Tener un nombre de archivo extremadamente único como objetivo.
  5. Tenga esto como una plantilla T4 separada
  6. Ejecuta esto después de tu herramienta personalizada

    <#@ template debug="true" hostSpecific="true" #> <#@ output extension=".cs" #> <#@ Assembly Name="System.Core" #> <#@ import namespace="System" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Collections.Generic" #> <# string file = @"C:/.../MyProject.sqlproj"; string [] lines = System.IO.File.ReadAllLines(file); //relative path of file you want to change build action string target = @"Models/GeneratedClass.cs"; //find the line that has your class for(int i = 0; i < lines.Length ; i++) { if(lines[i].Contains(target)) { //Replace Compile with None lines[i].Replace("Compile", "None"); } } string templateDirectory = Path.GetDirectoryName(Host.TemplateFile); string outputFileName = "newCSProj.sqlproj"; string outputFilePath = Path.Combine(templateDirectory, outputFileName); File.WriteAllLines(outputFilePath, lines); #>

Aquí está la advertencia que muestra Visual Studios antes de ejecutar una plantilla de texto

Advertencia de seguridad: la ejecución de esta plantilla de texto puede dañar su computadora. No lo ejecute si lo obtuvo de una fuente no confiable.


Esta respuesta fue mencionada en los comentarios, pero alguien podría pasarla por alto. La extensión de salida modificada, por ejemplo, a ".sqlscript" y la acción de compilación predeterminada será Ninguna.

<#@ output extension=".sqlscript" #>

También puede cambiar el editor predeterminado para esta extensión a

"Herramientas de datos de Microsoft SQL Server, Editor T-SQL"

para que pueda leerlo y editarlo como script estándar de T-SQL. Solo ve a

Herramientas -> Opciones .. -> Editor de texto -> Extensiones de archivo.

No resuelve el problema con los archivos ".sql", pero es una buena solución y funciona bien para mí. Lo probé en VS2015 pero probablemente funciona de manera similar en VS2013.