【问题标题】:T4 Run or compile tt files during runtime in C#T4 在 C# 运行时运行或编译 tt 文件
【发布时间】:2017-02-03 21:49:59
【问题描述】:

我对模板引擎的初始要求之一是我能够将“原始”模板文件(在 .tt 文件的情况下)保留在库执行/转换它们的“外部”,以允许如有必要,开发人员使用所述库对模板进行小幅调整,具体取决于他们需要生成的内容的要求。

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

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

【问题讨论】:

    标签: c# visual-studio templates t4


    【解决方案1】:

    有完全相同的情况 - 主项目之外的 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 进行管理。

    附言对此有一个问题 - 无法正确替换 CustomToolNamespace。

    【讨论】:

    • 感谢您的回复。我将您的回答(如果我错了,请纠正我)解释为需要重新编译整个 DLL 以解决“tt”文件中的任何更改。我希望我可以创建一个类似于 Nuget 包的东西,在其中你会得到一个 DLL,其中包含一些类,包括一个“模板转换器”类,该类将被调用以生成输出文件,并将包括用于基础的 tt 文件转变。然后,当运行时,DLL 将处理使用 T4 文件执行文本转换所需的任何操作。你觉得这可能吗?
    • 在提供的解决方案中,每个 tt 文件都将从 tt 转换为 cs/vb,其结果以及任何其他文件(*.cs/*vb、*.resx 等)将是编译成单个 DLL。
    • 在提供的解决方案中,每个 tt 文件都将从 tt 转换为 cs/vb,其结果以及任何其他文件(*.cs/*vb、*.resx 等)将是编译成单个 DLL。如果您只想重新编译模板 - 您可以将项目分成两个 - 仅模板和其余部分。通过这种方式,您将能够更新任何模板并使用 MsBuild 在简单的 *.bat 中重新编译它们。但这需要系统上几乎完整的 Visual Studio。
    • 如果您愿意在目标系统上进行完整的模板处理,您可以查看 TextTransfor.exe(这是 TT 编译器),然后查看 csc.exe(这是 CS 编译器)并同时进行编译阶段。但我不推荐这种方式 - 项目文件中更改的 MsBuild 完全一样,甚至更多。
    猜你喜欢
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多