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

时间:2017-03-22 22:02:46

标签: t4 visual-studio-2017 csproj

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

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

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

我有什么需要做的才能让它发挥作用吗?

2 个答案:

答案 0 :(得分:15)

.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>

Related GitHub issue

修改

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

答案 1 :(得分:1)

我意识到这已经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 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

YMMV。如果您的项目是一个网络项目,则附近可能有一条与Microsoft.WebApplication.targets类似的线,您可以从中汲取灵感。

应该重新启动Visual Studio。如果删除了.tt文件发出的转换文件,然后重建了项目,则应该看到发出的文件重新出现。