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

11

我将一个基于project.json/.xproj格式的项目迁移到了更新的CS2017 .csproj格式。

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

在保存或构建时,它不会重新生成输出。输出的.cs文件也没有嵌套在.tt文件下面。

是否有什么需要我做才能让它工作?

2个回答

16

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

如果您从旧的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>

相关GitHub问题

编辑

如下方评论所述,您可以通过在项目中排除,然后包含模板来快速轻松地完成此操作。


5
我发现你可以右键单击 排除 TT 文件,然后如果 Visual Studio 的转换未明确标记 TT 文件,可以再次包含它。 - jbtule
谢谢。这是一个很好的提示。我已经把它加到我的答案中了。 - Bennor McCarthy
这很奇怪。这正是我所拥有的,但是在VS2016和VS2017上都没有生成txt文件。 - Shahar Prish
1
字符串“TextTemplatingFileGenerator”正是我所寻找的。VS2017的转换未设置TT文件上的“自定义工具”属性。我知道它需要设置为某些东西,但不知道什么。对于将来的访问者,如果您单击TT文件,请检查属性窗口,并确保将“Custom Tool”设置为TextTemplatingFileGenerator。自定义工具命名空间应为空白。 - lc.
谢谢这个提示。我的解决方案有问题。据我所见,一切都设置正确了。保存时生成有效,但构建时生成无效。问题的原因是什么? - Cubelaster
在我的情况下,问题是 csproj 文件中 <None Include="Foo.tt"> 被写成了 <None Update="Foo.tt"> - Lennart

2

我知道这是2年前的内容,但对于像我这样多年后遇到这个问题的人来说,下面列出的方法适用于我,而无需安装任何东西。我遇到了完全相同的问题,在将项目从Visual Studio 2010升级到Visual Studio 2017后。您的情况可能会有所不同。在开始之前备份您的.csproj文件。

通过编辑.csproj项目文件,可以在构建项目时强制重建所有.tt文件,而无需安装任何内容。编辑.csproj文件似乎有点繁琐,但这是官方认可的方法https://learn.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 Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.CSharp.targets)

在该行下面,添加如下一行:”
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0\TextTemplating\Microsoft.TextTemplating.targets" />

(对于兴趣,在我的电脑上解析为 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\VisualStudio\v15.0\TextTemplating\Microsoft.TextTemplating.targets
可能因人而异。如果您的项目是Web项目,则可能附近有一行类似于Microsoft.WebApplication.targets的内容,您可以从中获得灵感。
这样做,可能需要重新启动Visual Studio。如果您删除了.tt文件生成的转换文件,然后重新构建项目,您应该会看到生成的文件重新出现。

该链接文章具有重要的附加价值。MSBUILD 生成的模板与 IDE 不同,因此我的 $(ProductVersion) 在生成的 CS 文件中实际上是直接输出的。该文章展示了如何修改 CSPROJ 文件以使其正常工作。 - Ed Bayiates

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