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

时间:2017-02-03 21:50:00

标签: c# visual-studio templates t4

我对模板引擎的最初要求之一就是我能够保持原始数据。模板文件(在.tt文件中)' outside'库执行/转换它们的目的是允许使用所述库的开发人员根据需要生成的要求对模板进行小的调整。

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

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

1 个答案:

答案 0 :(得分:0)

具有完全相同的情况 - 主项目之外的T4模板集。 但它有点复杂 - 我有一些动态生成的T4模板。

我尝试以下选项:

  • 批处理(使用半手动编写脚本)将T4编译为CS,将CS编译为DLL;
  • 扫描给定目录的T4模板和构建* .csproj& * .sln for directory;
  • 使用Visual Studio管理和构建带有T4模板的DLL。

所有这些都很好,但目前我切换到最后一个。

有一个原因:

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

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

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

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

这就是全部。

在此之后,你保持原始的&#39;模板在任何需要它们的地方,将它们组织为DLL类型项目中的普通项目,并在每个构建中都有一个实际的副本。

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

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