Generated (by T4) file Build Action gets reset to Build

时间:2015-05-04 19:54:58

标签: c# .net visual-studio t4

We have a database project in Visual Studio 2013. In this project we have a .tt file which generates .sql script. The problem is after generation the build action of the generated file is automatically set to Build. If we change it manually to None, it gets reset to Build after regenerating (running custom tool).

Another strange thing is that it only happens if .tt file is in database project and in some folder of that project (not in root). if .tt file is in another project (anywhere) or in the root of the database project, the build action of the generated file does not change after regeneration.

We don't have any Visual Studio add-ins and I tried to disable all extensions and updates which could be disabled.

I will give you any details if needed.

2 个答案:

答案 0 :(得分:1)

如何存储构建操作?在csproj 注意:使用编译

的构建操作编译生成的类文件

注意:使用无

的构建操作编译generatedFile.cs

现在将其设置为无。

确定一个更改sqlproj的T4模板。 注意:这是为sqlproj保存一个新文件,而不是写入现有的sqlproj,因为您至少需要:

  1. 备份你的sqlproj
  2. 测试新文件
  3. 修改此项以备份sqlproj以防万一。
  4. 拥有一个非常独特的文件名作为目标。
  5. 将此作为单独的T4模板
  6. 自定义工具后
  7. Run this

        <#@ 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); 
    
      #>
    
  8. 以下是Visual Studios在运行文本模板之前显示的警告

    安全警告: 运行此文本模板可能会损害您的计算机。如果您从不受信任的来源获取它,请不要运行它。

答案 1 :(得分:1)

这个答案在评论中有点提及,但有人可能会错过它。将输出扩展名更改为例如“.sqlscript”和默认的Build Action将为None。

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

您还可以将此扩展程序的默认编辑器更改为

  

“Microsoft SQL Server数据工具,T-SQL编辑器”

因此您可以将其作为标准T-SQL脚本进行阅读和编辑。只需转到

  

工具 - &gt;选项...... - &gt;文字编辑器 - &gt;文件扩展名。

它没有解决“.sql”文件的问题,但它是一个很好的解决方法,对我来说很好。我在VS2015中进行了测试,但它在VS2013中的功能类似。