代码之家  ›  专栏  ›  技术社区  ›  Daren Thomas

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

  •  5
  • Daren Thomas  · 技术社区  · 15 年前

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

    这不可能是正确的方法!

    理想情况下,如果XML文件已更改,我希望Visual Studio 2008对T4文件执行文本转换。我有点不知所措,因为我不知道visual studio是如何构建c项目的,所以指向这个方向的指针也会有帮助(然后我可以自己尝试找出答案)。

    2 回复  |  直到 13 年前
        1
  •  2
  •   Oleg Sych    15 年前

    您可以使用t4scriptfilegenerator T4Toolbox 作为XML文件的自定义工具。假设使用此自定义工具在项目中有test.xml文件。首次保存test.xml时,此自定义工具将创建一个新的test.tt文件。您可以将代码生成逻辑放在那里(放在适当的位置,或者包括其他.tt文件)。下次保存test.xml时,它将转换(从中生成代码)现有的test.tt。

        2
  •  2
  •   Daren Thomas    13 年前

    我想我终于找到了解决办法。我在浏览如何在c项目的项目文件中提到xaml文件时有了这个想法。

    让我们假设一个文件 A.tt B.tt 使用来自 C.xml 我们希望在任何时候重新生成代码 C.XML 变化。

    编辑项目文件。你的定义 A.T. B.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.cs B.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.T. B.TT .