【问题标题】:T4 templates not generating output in new VS2017 csproj projectsT4 模板未在新的 VS2017 csproj 项目中生成输出
【发布时间】:2017-03-22 22:02:46
【问题描述】:

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

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

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

我必须做些什么才能让它工作吗?

【问题讨论】:

    标签: t4 visual-studio-2017 csproj


    【解决方案1】:

    .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

    编辑

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

    【讨论】:

    • 我发现你可以右击 排除 TT文件,然后如果Visual Studio的转换错过了再include显式标记 TT 文件。
    • 谢谢。这是一个很好的提示。我已将其添加到我的答案中。
    • 这很奇怪。这正是我所拥有的,但在 VS2016 和 VS2017 上都没有生成 txt 文件。
    • 字符串TextTemplatingFileGenerator 正是我想要的。 VS2017 的转换错过了在 TT 文件上设置“自定义工具”属性。我知道它需要设置为something,但不知道what。对于未来的访问者,如果您单击 TT 文件,请检查属性窗口并确保“自定义工具”设置为 TextTemplatingFileGenerator。自定义工具命名空间应为空。
    • 感谢您的提示。我的解决方案有问题。据我所知,一切都设置正确。 Generate on save 作品,但 generate on build 没有。问题的原因可能是什么?
    【解决方案2】:

    我意识到这是 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。如果你的项目是 web 项目,那么附近可能有一条类似但与 Microsoft.WebApplication.targets 相关的线路,你可以从中汲取灵感。

    这应该可以通过重新启动 Visual Studio 来完成。如果您删除 .tt 文件发出的转换文件,然后重新构建项目,您应该会看到发出的文件重新出现。

    【讨论】:

    • 链接的文章具有显着的附加价值。 MSBUILD 生成模板的方式与 IDE 不同,因此我的 $(ProductVersion) 直接出现在生成的 CS 文件中。本文展示了如何更改 CSPROJ 文件以使其正常工作。
    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多