T4 模板不在新的 VS2017 csproj 项目中生成输出

T4 templates not generating output in new VS2017 csproj projects

我将 project.json/.xproj 项目迁移到较新的 CS2017 .csproj 格式。

该项目包含一个 T4 (.tt) 模板文件。

它不会在保存或构建时重新生成其输出。输出 .cs 文件也未嵌套在 .tt 文件下方。

我需要做些什么才能让它正常工作吗?

.tt 文件仅由 VS 在保存 时自动运行。您可以安装 AutoT4 让它们 运行 before/after 构建。 (请注意,目前新 .csproj 文件存在限制 - 选项不会在属性 window 中显示。)

如果您是从旧的 project.json/.xproj 格式转换过来的,您可能需要明确地将模板添加到项目中:

<ItemGroup>
  <None Update="Foo.tt">
    <Generator>TextTemplatingFileGenerator</Generator>
    <LastGenOutput>Foo.cs</LastGenOutput>
  </None>
  <Compile Update="Foo.cs">
    <DesignTime>True</DesignTime>
    <AutoGen>True</AutoGen>
    <DependentUpon>Foo.tt</DependentUpon>
  </Compile>
</ItemGroup>

Related GitHub issue

编辑

正如下面评论中提到的,您可以通过排除然后将模板包含在您的项目中来快速轻松地完成此操作。

我知道这已经有 2 年多的历史了,但是对于那些像我一样多年遇到这个问题的人来说,下面列出的方法对我来说适用,无需安装任何东西。将项目从 Visual Studio 2010 升级到 Visual Studio 2017 后,我遇到了完全相同的问题。YMMV。在开始之前备份 .csproj 文件。

通过编辑 .csproj 项目文件,无需安装任何东西即可在构建项目时强制重建所有 .tt 文件。编辑 .csproj 文件似乎很笨拙,但这是批准的方式 https://docs.microsoft.com/en-gb/visualstudio/modeling/code-generation-in-a-build-process?view=vs-2015

在您的 .csproj 文件中,您会发现很多 PropertyGroup 节点。在 PropertyGroup 节点列表的末尾(位置不重要),添加另一个具有以下内容的 PropertyGroup 节点:

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

现在查看 .proj 文件的末尾,您会看到这样一行:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

(有趣的是,在我装有 VS2017 的计算机上解析为 C:\Program Files (x86)\Microsoft Visual Studio17\Community\MSBuild.0\Bin\Microsoft.CSharp.targets

在那行下面,添加这样一行:

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

(出于兴趣,在我的计算机上解析为 C:\Program Files (x86)\Microsoft Visual Studio17\Community\MSBuild\Microsoft\VisualStudio\v15.0\TextTemplating\Microsoft.TextTemplating.targets

YMMV。如果你的是一个 web 项目,附近可能有一行类似但与 Microsoft.WebApplication.targets 有关的行,你可以从中汲取灵感。

那,可能需要重新启动 Visual Studio,应该可以做到。如果删除 .tt 文件发出的转换文件,然后重建项目,您应该会看到发出的文件重新出现。