我正在尝试使用 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/