增量构建的MSBuild时间戳问题

时间:2014-12-14 23:47:54

标签: c# msbuild t4

我有一个C#类库项目,它引用了另一个类库项目(EdmResources引用框架)。 EdmResources只包含一个T4模板,它总是在项目构建时执行,以编译和写出Entity Framework的EDMX文件。

EdmResources项目始终构建,无论Framework程序集是最新的还是需要构建 - 这会大大减慢我们的构建过程。我想要的是EdmResources只在Framework程序集需要重新编译时构建。

我尝试输出Framework程序集的最后写入时间作为EdmResources.tt的输出,然后只有在程序集上的最后写入时间大于模板输出文件中记录的时间戳时才执行EDMX生成。

这不起作用,因为MSBuild总是更新Framework程序集的最后写入时间,即使没有更改也没有重新编译代码。

基本上,有没有办法在构建反映实际构建时间戳的Framework项目的过程中从MSBuild生成信号文件? IE,只有在实际重新编译某些代码时才会更新。然后可以使用该文件而不是Framework程序集上的最后写入时间。

谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了一个很好的解决方案。我将此代码放在顶部的Framework项目文件中:

<PropertyGroup>
   <TargetsTriggeredByCompilation>
        $(TargetsTriggeredByCompilation);
        AfterCompilation
    </TargetsTriggeredByCompilation>
</PropertyGroup>

然后在文件底部添加了AfterCompilation目标:

<!-- This target will be called by CoreCompile only when it runs -->
<Target Name="AfterCompilation" >
    <!-- Output Timestamp File -->
    <ItemGroup>
      <SignalFile Include="$(OutDir)MyCompany.Framework.timestamp" />
    </ItemGroup>
    <PropertyGroup>
      <Ticks>$([System.DateTime]::Now.Ticks)</Ticks>
    </PropertyGroup>
    <WriteLinesToFile File="@(SignalFile)" Lines="$(Ticks)" Overwrite="true" />
</Target>

因此,这意味着只有在代码编译时才会生成时间戳文件,如果从未调用CoreCompile目标,则不会更新时间戳文件。然后,我可以从我的T4模板中查看此时间戳文件,并正确确定是否还需要重建我的EDMX文件。

相关问题