当XML文件发生更改时,如何强制Visual Studio 2008从T4模板重新生成代码?

时间:2009-10-28 09:29:05

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

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

这不是正确的做法!

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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>

我相信在您创建模板文件时,大部分内容都已经为您完成了,因此您真正需要添加的是<DependentUpon>C.xml</DependentUpon> ItemGroup部分的A.tt部分B.tt和{{1}}。