【问题标题】:How to force Visual Studio 2008 to regenerate code from T4 templates when an XML file changes?当 XML 文件更改时,如何强制 Visual Studio 2008 从 T4 模板重新生成代码?
【发布时间】:2010-12-10 19:14:06
【问题描述】:

我从一个 XML 文件生成了相当多的代码,但是这些模板被组织在两个不同的 T4 模板中。每当我更改 XML 文件时,我必须记住打开两个 *.tt 文件,简单地更改它们(添加/删除空格)并再次保存以确保生成代码。

这不是正确的做法!

理想情况下,如果 XML 文件已更改,我希望 Visual Studio 2008 对 T4 文件进行文本转换。我有点迷茫,因为我真的不知道 Visual Studio 如何构建 C# 项目,所以指向那个方向的指针也会有所帮助(然后我可以自己尝试弄清楚)。

【问题讨论】:

  • 顺便说一句:我发现热门的 Visual Studio 构建 C# 项目:MSBuild。项目文件本身 (*.csproj) 是一个 MSBuild 文件,类似于 Makefile。因此,一个解决方案可能是在“构建”XML 文件时触摸 *.tt 文件......我会及时通知你。

标签: c# visual-studio-2008 code-generation t4


【解决方案1】:

您可以使用来自T4Toolbox 的 T4ScriptFileGenerator 作为您的 XML 文件的自定义工具。假设您的项目中有使用此自定义工具的 Test.XML 文件。第一次保存 Test.XML 时,此自定义工具会创建一个新的 Test.tt 文件。您可以将代码生成逻辑放在那里(就地,或#include 您的其他 .tt 文件)。下次保存 Test.XML 时,它将转换(生成代码)现有的 Test.tt。

【讨论】:

    【解决方案2】:

    我想我可能终于在这里找到了解决方案。在浏览 C# 项目的项目文件中如何提及 XAML 文件时,我得到了这个想法。

    让我们假设一个文件 A.ttB.tt 使用来自 C.xml 的数据,我们希望在 C.xml 更改时重新生成代码。

    编辑项目文件。您对A.ttB.tt 的定义应如下所示:

    <ItemGroup>
        <None Include="A.tt">
          <Generator>TextTemplatingFileGenerator</Generator>
          <LastGenOutput>A.cs</LastGenOutput>
          <DependentUpon>C.xml</DependentUpon>
        </None>
        <None Include="B.tt">
          <Generator>TextTemplatingFileGenerator</Generator>
          <LastGenOutput>B.cs</LastGenOutput>
          <DependentUpon>C.xml</DependentUpon>
        </None>
    </ItemGroup>
    

    此外,您将需要(当然...)

    <ItemGroup>
        <None Include="C.xml" />
    </ItemGroup>
    

    还有自动生成A.csB.cs的指令:

    <Compile Include="A.cs">
          <DependentUpon>A.tt</DependentUpon>
          <AutoGen>True</AutoGen>
          <DesignTime>True</DesignTime>
    </Compile>
    <Compile Include="B.cs">
          <DependentUpon>B.tt</DependentUpon>
          <AutoGen>True</AutoGen>
          <DesignTime>True</DesignTime>
    </Compile>
    

    我相信当您创建模板文件时,大部分工作已经为您完成,所以您真正需要添加的只是ItemGroups 中的&lt;DependentUpon&gt;C.xml&lt;/DependentUpon&gt; 部分,用于A.ttB.tt

    【讨论】:

    • 如果这是正确的,那将很有意义。可悲的是它不是:( - DependentUpon 显然仅用于项目树视图中的演示目的。
    • @Ibmurai,是的,我也发现了......我只是没有任何明确的证据,然后继续前进。感谢您指出这一点!
    猜你喜欢
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2011-02-13
    • 2011-03-22
    • 2013-10-03
    • 1970-01-01
    相关资源
    最近更新 更多