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()
{
}
}
}
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
GenerationEnvironmentis aStringBuilderwhich 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: