将 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()
{
}
}
}
I'm trying to use T4 templates to make generating migrations for our system slightly easier. The one thing that I can't quite figure out (and this makes me wonder if I'm using T4 templates for the wrong thing) is how to copy the rendered output to a new file. I can manually create a file and copy the contents of the generated file, but that kind of goes against my whole "make things easier" ethos here.
Here's the template I have. Upon rendering, it would ideally get copied to "62-CreateWidgetsTable.cs" in the same directory. The goal is to have a file that I can now edit (I am generating a template, in other words, not generating the complete file.) If I could rename the generated file in VS (and then have the t4 generate a new template that would just sit there until someone came along and used it), that would be good enough.
<#@ 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()
{
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
好吧,我想出了几种方法来做到这一点。最简单的方法(我在按照我要向您展示的方式进行操作之后才发现)如下:t4 将输出附加到现有文件。关键信息是
GenerationEnvironment
是一个StringBuilder
,其中包含运行模板的结果,因此您可以将该结果写入您想要的任何旧文件!另一种方法是使用 T4 Toolbox。快去下载吧!
然后,您可以创建一个模板,该模板创建一个扩展
Template
(由 T4 工具箱定义)的类,该类覆盖一些默认行为:Alright, I figured out a couple ways to do this. The simplest way to do it (which I found only after doing it the way I'm about to show you) is here: t4 append output to existing file. The key information is
GenerationEnvironment
is aStringBuilder
which contains the result of running the template, so you can just write that result to any old file you want!The other way to do it is to use T4 Toolbox. Go download it!
Then, you can make a template that create a class that extends
Template
(defined by T4 toolbox) that overrides some default behavior:在某些项目中,我使用了下面的 FileManager 类。它是基于此博客文章的自定义实现: http://damieng.com/blog/2009/11/06/multiple-outputs-from-t4-made-easy-revisited
In some Projects I use allready the FileManager class below. Its a custominated implementation based on this blog post: http://damieng.com/blog/2009/11/06/multiple-outputs-from-t4-made-easy-revisited
我发现在没有插件的情况下执行此操作的最简单方法是右键单击目标项目并转到“添加”->“现有项目并选择您生成的文件。这会在项目的根目录下为您创建一个文件副本,然后您可以根据需要移动该副本。这使您可以轻松地将生成的文件传输到生成它们的项目之外的项目中。
我还没有测试当 .tt 文件本身位于项目的根目录中时会发生什么,但只要 .tt 文件存在,这绝对有效。位于子文件夹中(无论如何,这可能是一个很好的做法)。
The easiest way I have found to do this without plugins is to right-click your target project and go to Add -> Existing Item and select your generated file. This makes a copy of the file for you at the root of the project, which you can then move as needed. This allows you to easily transfer generated files to projects besides the one that they were generated in.
I haven't tested what happens when the .tt file is itself in the root of a project, but this definitely works so long as the .tt is in a subfolder (which is probably good practice anyhow).