生成(通过T4)文件构建操作将重置为Build

我们在Visual Studio 2013中有一个数据库项目。在这个项目中,我们有一个生成.sql脚本的.tt文件。 问题是在生成之后,生成的文件的构建操作自动设置为Build。 如果我们手动将其更改为None,则会在重新生成(运行自定义工具)后重置为Build。

另一个奇怪的事情是,只有.tt文件位于数据库项目和该项目的某个文件夹中(不在root中)才会发生。 如果.tt文件位于另一个项目(任何地方)或数据库项目的根目录中,则生成文件的构建操作在重新生成后不会更改。

我们没有任何Visual Studio加载项,我尝试禁用可以禁用的所有扩展和更新。

如果需要,我会给你任何细节。

如何存储构建操作? 在csproj中注意:使用Compile的构建操作编译Generated Class文件

注意:使用None的构建操作编译generatedFile.cs

所以现在把它设置为None。

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

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

    <#@ 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); #> 

以下是Visual Studios在运行文本模板之前显示的警告

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

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

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

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

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

因此您可以将其作为标准T-SQL脚本进行读取和编辑。 去吧

工具 – >选项.. – >文本编辑器 – >文件扩展名。

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