【问题标题】:Write T4 generated code to separate output files编写 T4 生成的代码以分隔输出文件
【发布时间】:2020-05-29 13:33:33
【问题描述】:

我正在创建一个.tt 文件,用于将文本转换为模型类以进行练习。

会生成一个包含所有models.cs 文件,但我希望将每个model 保存在不同文件夹中的自己的.cs 文件中。

实现这一目标的最佳方法是什么?

【问题讨论】:

  • 我不知道你说的loose是什么意思?
  • 单独的文件,而不是打包在一个文件中

标签: c# .net templates transformation t4


【解决方案1】:

这是一个简单的示例,您可以如何从单个 T4 模板输出多个文件。

使用SaveOutput-方法输出文件(Content1.txt,Content2.txt..)创建到与 .tt-file 相同的文件夹,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();
}
#>

【讨论】:

  • 谢谢!我通过使用 StringBuilder 修复它并使用 StreamWriter 写入特定路径。我也会试试你的解决方案!
  • 您有什么理由使用this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length) 而不是仅仅使用this.GenerationEnvironment.Clear()?否则这段代码非常棒,我们在使用它时稍作调整(例如让它输出 UTF-8)谢谢!
  • @aolszowka 很高兴听到我的 sn-p 有帮助。不幸的是,我不记得有任何不使用 .Clear() 的特殊原因。我进行了快速测试,它似乎可以在我的机器上运行。如果它也可以在您的机器上使用 .Clear(),我可以修改我的答案,因为 .Clear() 更优雅..
  • @RistoM 非常感谢你,它极大地简化了我们的 T4 转换,因为我们能够放弃 TemplateFileManager (T4.Helper),它允许我们使用 TextTransform.exe 自动化而不依赖于 Visual工作室。
  • @aolszowka 我编辑了答案,感谢您的贡献!
猜你喜欢
  • 2016-09-06
  • 2012-06-29
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2013-11-18
相关资源
最近更新 更多