T4 模板在构建期间未转换

Posted

技术标签:

【中文标题】T4 模板在构建期间未转换【英文标题】:T4 templates not transformed during build 【发布时间】:2020-08-06 23:19:54 【问题描述】:

我做了什么

我尝试将我的 T4 模板编译成 c# 文件。

我从 Microsoft: Invoke text transformation in the build process

尝试过的内容

通过添加我的 .csproj 文件:

  <Import Project="TextTemplating\Microsoft.TextTemplating.targets" />
  <PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
    <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
  </PropertyGroup>
  <ItemGroup>
    <T4ParameterValues Include="ProjectDir">
      <Value>$(ProjectDir)</Value>
      <Visible>false</Visible>
    </T4ParameterValues>
  </ItemGroup>

TextTemplating 是一个目录,其中包含来自我的编辑器的 TextTemplating 文件,位于: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\msbuild\Microsoft\VisualStudio\v16.0\TextTemplating

模板

基础模板(命名为 ModelTemplate.tt):

<#@ template language="C#" #>
<#@ parameter name="ClassName" type="System.String"#>
<#@ parameter name="Namespace" type="System.String"#>

namespace <#= Namespace #> 

    public class <#= ClassName #>
    

    

最后是测试ModelTemplate.tt的模板(命名为ModelTemplateTest.tt):

<#@ template debug="false" language="C#" #>
<#@ output extension=".cs" #>
<#
    _ClassNameField = "Model";
    _NamespaceField = "MyNamespace";
#>
<#@ include file="$(ProjectDir)\Templates\ModelTemplate.tt"#>

构建的输出

A custom tool 'TextTemplatingFilePreprocessor' is associated with file 'Templates\ModelTemplate.tt', but the output of the custom tool was not found in the project.  You may try re-running the custom tool by right-clicking on the file in the Solution Explorer and choosing Run Custom Tool.       

但是ModelTemplateTest.tt被编译成:

namespace MyNamespace 

    public class Model
    

    

如何在我的构建中调用TextTemplatingFilePreprocessor

【问题讨论】:

【参考方案1】:

T4Executer 可能是一个解决方案,它是一个 VS 扩展,允许您在项目构建时触发特定 T4 文件的执行。

【讨论】:

【参考方案2】:

解决方案(使用 Visual Studio Enterprise 2019) 是在 .csproj 文件中导入 $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v16.0\TextTemplating\Microsoft.TextTemplating.targets,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
  </PropertyGroup>
  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets" />
</Project>

相关 *** 线程:Product of build-time T4 transformation is used only in the next build

【讨论】:

你有办法不明确指定“v16.0”吗?这将需要基于构建机器和较新 VS 版本的动态值。 @Luishg 我对 Microsoft 构建工具不是很有经验,也许有可能 你可以使用&lt;Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets" /&gt; 谢谢@StarNamer 我会编辑我的答案

以上是关于T4 模板在构建期间未转换的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建时在 Blazor 项目中运行 T4 模板

在构建服务器上运行 TextTransform.exe (T4)

在运行时(构建时)创建 T4 模板?

构建时 T4 转换的产品仅在下一个构建中使用

MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板

PetaPoco的T4模板报错的问题