T4模板在构建过程中未被转换

5

我所做的事情

我试图将我的T4模板编译成一个C#文件。

我尝试从Microsoft: 在构建过程中调用文本转换中学到的方法:

通过在我的.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 ?

2个回答

3

使用 Visual Studio Enterprise 2019 解决方案的方法是,在 .csproj 文件中按如下方式导入$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\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>

相关的StackOverflow帖子: 构建时T4转换的产品仅在下一个构建中使用


你有没有不需要明确指定“v16.0”的方法? 这将需要基于构建机器和更新的VS版本的动态值。 - Luishg
@Luishg 我对微软构建工具不是很有经验,也许是可能的。 - loic.lopez
4
您可以使用 <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets" /> - StarNamer
谢谢@StarNamer,我会编辑我的答案。 - loic.lopez

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接