file - 将 T4 模板输出复制到新文件

标签 file copy t4

我正在尝试使用 T4 模板来使为我们的系统生成迁移稍微容易一些。我不太明白的一件事(这让我想知道我是否将 T4 模板用于错误的事情)是如何将呈现的输出复制到一个新文件。我可以手动创建一个文件并复制生成文件的内容,但这种做法违背了我“让事情变得更简单”的整体理念。

这是我的模板。渲染时,理想情况下会将其复制到同一目录中的“62-CreateWidgetsTable.cs”。目标是拥有一个我现在可以编辑的文件(我正在生成一个模板,换句话说,不是生成完整的文件。)如果我可以在 VS 中重命名生成的文件(然后让 t4 生成一个新模板会一直坐在那里,直到有人出现并使用它),这就足够了。

  <#@ template debug="false" hostspecific="false" language="C#" #>
  <#@ output extension=".cs" #>
  <#
    var migrationNumber = "62";
    var migrationName = "CreateWidgetsTable";
  #>
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using Migrator.Framework;

  namespace WidgetsIntl.Console.Migrations
  {
    [Migration(<#= DateTime.UtcNow.ToString("yyyyMMddhhmmss") #>)]
    public class _<#= migrationNumber  #>_<#= migrationName #> : Migration
    {
      public override void Up()
      {

      }

      public override void Down()
      {

      }
    }
  }

最佳答案

好吧,我想出了几个方法来做到这一点。最简单的方法(我按照我即将向您展示的方式进行操作后才发现)在这里:t4 append output to existing file .关键信息是 GenerationEnvironment 是一个 StringBuilder,其中包含运行模板的结果,因此您可以将该结果写入您想要的任何旧文件!

另一种方法是使用 T4 Toolbox .去下载吧!

然后,您可以创建一个模板,该模板创建一个类,该类扩展 Template(由 T4 工具箱定义),覆盖一些默认行为:

<#@ template language="C#" hostspecific="True" debug="True" #>
<#@ include file="T4Toolbox.tt" #>
<#
    // make an instance of the class we define below, set some variables, and render it
    var tpl = new MyT4();
    tpl.MyVar = "Do those things you do";
    tpl.Render();
#>
<#+
public class MyT4 : Template 
{
    public MyVar = "some stuff";

    public override string TransformText()
    {
        Output.PreserveExistingFile = true; // tells T4 that you want to manually edit this file afterward (for scaffoling, which was my use case)
        Output.File = MyVar + ".cs"; // output will go in "some stuff.cs"

        /******************
        Template is defined here!
        *******************/
    #>
    public class <#=myVar.Replace(" ", "_") #> 
    { 
        public void Method()
        {
            return "Hi, I am <#= myvar #>";
        }
    }
    <#+
        /*************************
        now finishing up the TransformText() method
        *************************/

        return GenerationEnvironment.ToString();
    }
}
#>

关于file - 将 T4 模板输出复制到新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6102476/

相关文章:

c++ - 如何将 map 中的 copy_if 复制到 vector ?

.net - 这个 hack 是 T4 的定义行为吗

entity-framework - Ef 4.x dbcontext 生成器在执行时失败

c - 这样创建的文件放在哪里?

java - Vaadin上传功能

python - 审核文件中的行

.NET - 从非托管阵列复制到非托管阵列

c++ - 使用 Visual Studio .ncb 文件进行反射

c++ - copy_if 与保存序列和使用复制

c# - 通过 T4 代码生成自动 INotifyPropertyChanged 实现?