将T4生成的代码写入单独的输出文件

3
我正在创建一个.tt文件,将文本转换为模型类以进行练习。
生成了一个包含所有模型的.cs文件,但我希望每个模型都保存在自己的.cs文件中,并放置在不同的文件夹中。
如何最好地实现这一点?

我不确定你所说的“loose”是什么意思? - mjwills
将文件分开,而不是打包在一个文件中。 - Tim Maes
1个回答

6
这里有一个简单的示例,演示如何从单个T4模板输出多个文件。
使用SaveOutput-方法输出文件(Content1.txt,Content2.txt..)会创建到与.tt文件相同的文件夹中,使用SaveOutputToSubFolder则可以将文件输出到单独的文件夹中(1\Content1.txt, 2\Content2.txt..)。
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".txt" #>
<#
for (Int32 i = 0; i < 10; ++i) {
#>
File Content <#= i #>
<#

  SaveOutput("Content" + i.ToString() + ".txt");
  //Uncomment following to write to separate folder 1,2,3
  //SaveOutputToSubFolder(i.ToString(),"Content" + i.ToString() + ".txt");
}
#>
<#+
private void SaveOutput(string outputFileName) {
  string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
  string outputFilePath = Path.Combine(templateDirectory, outputFileName);
  File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString()); 
  this.GenerationEnvironment.Clear();
}
private void SaveOutputToSubFolder(string folderName, string outputFileName) {
  string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
  string newDirectoryName = Path.Combine(templateDirectory,folderName);
  if(!Directory.Exists(newDirectoryName))
    Directory.CreateDirectory(newDirectoryName);
  string outputFilePath = Path.Combine(newDirectoryName, outputFileName);
  File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString()); 
  this.GenerationEnvironment.Clear();
}
#>

1
谢谢!我用 StringBuilder 和 StreamWriter 写入特定路径解决了问题。我也会尝试你的解决方案! - Tim Maes
1
你为什么使用 this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length) 而不是 this.GenerationEnvironment.Clear() 呢?除此之外,这段代码非常棒,我们只需要进行一些小的调整(例如将其输出为 UTF-8)。谢谢! - aolszowka
1
@aolszowka 很高兴听到我的代码片段有所帮助。不幸的是,我不记得为什么没有使用.Clear()。我进行了快速测试,在我的机器上似乎可以工作。如果在您的机器上也可以使用.Clear(),我可以修改我的答案,因为.Clear()更加优雅。 - Risto M
1
@RistoM 非常感谢您,这大大简化了我们的 T4 转换过程,因为我们能够放弃 TemplateFileManager (T4.Helper),从而使我们能够自动化使用 TextTransform.exe,而不依赖于 Visual Studio。 - aolszowka
1
@aolszowka,我编辑了答案,感谢您的贡献! - Risto M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接