T4 运行 或在 C# 运行时编译 tt 文件

T4 Run or compile tt files during runtime in C#

我对模板引擎的最初要求之一是我能够保留库 executing/transforming 的 'raw' 模板文件(如果是 .tt 文件)'outside'它们的预期目的是允许使用所述库的开发人员在必要时根据他们需要生成的内容的要求对模板进行小的调整。

该库是用 C# 编写的,到目前为止,我能够让它们工作的唯一方法是使用默认 'pre-compiled' C# class 为每个模板自动生成的 Visual Studio。我使用 "TextTransform.exe" 应用程序将 .tt 文件直接转换为其预期输出取得了一些成功,但与更原生的代码方法相比,这似乎很粗糙。

那么我要求做的是合理的还是我选择了错误的模板引擎来满足我的需要?非常感谢任何帮助。

有完全相同的情况 - 主项目之外的一组 T4 模板。 但这有点复杂 - 我有一些即时生成的 T4 模板。

我尝试以下选项:

  • 批量(使用 half-manual 脚本)将 T4 编译为 CS 以及将 CS 编译为 DLL;
  • 为 T4 模板扫描给定目录并为目录构建 *.csproj 和 *.sln 的副例程;
  • 使用 Visual Studio 使用 T4 模板管理和构建 DLL。

所有这些都工作正常,但目前我切换到最后一个。

有一个原因:

  • 我用通常的方式在 Visual Studio 中调试 T4 模板。
  • 我已经(使用 T4Toolbox)突出显示了 T4 语法。
  • 我可以轻松管理编译时间。

要在主构建之前重新编译项目中的所有模板,只需在 *.csproj 文件末尾添加 5 行:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets" />

<PropertyGroup>
<TransformOnBuild>true</TransformOnBuild>
<TransformOutOfDateOnly>false</TransformOutOfDateOnly>
</PropertyGroup>

就是这样。

在此之后,您可以将 'raw' 模板保留在任何需要的地方,将它们组织为 DLL-type 项目中的正常项目,并在每个构建中都有一个实际副本。

P.S。实际意味着如果有人在 Visual Studio 之外更改它们(例如在记事本中),您将重新编译它们。这可由 TransformOutOfDateOnly 管理。

P.P.S。遇到一个问题 - 无法正确替换 CustomToolNamespace。