我对模板引擎的最初要求之一是我能够将“原始”模板文件(在 .tt 文件的情况下)保留在库的“外部”执行/转换它们,以实现允许开发人员使用所述库根据需要生成的要求在必要时对模板进行细微调整。
该库是用 C# 编写的,到目前为止,我能够让它们工作的唯一方法是使用 Visual Studio 为每个模板自动生成的默认“预编译”C# 类。我使用“TextTransform.exe”应用程序将 .tt 文件直接转换为其预期输出取得了一些成功,但这与更原生的代码方法相比似乎很粗糙。
那么我要求做的事情是否合理,或者我是否选择了错误的模板引擎来满足我的需求?非常感谢任何帮助。
最佳答案
有完全相同的情况 - 主项目之外的 T4 模板集。 但它有点复杂 - 我有一些动态生成的 T4 模板。
我尝试以下选项:
- 将 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>
仅此而已。
此后,您可以将“原始”模板保留在任何需要的地方,将它们组织为 DLL 类型项目中的普通项目,并在每次构建时都有一个实际的副本。
附注实际上,如果有人在 Visual Studio 之外(例如在记事本中)更改它们,您将重新编译它们。这可以通过 TransformOutOfDateOnly 进行管理。
P.P.S。有一个问题 - 无法正确替换 CustomToolNamespace。
关于c# - T4 在 C# 运行时运行或编译 tt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42033558/