具有增量构建的MSBuild时间戳问题

我有一个C#类库项目引用另一个类库项目(EdmResources参考框架)。 EdmResources只包含一个T4模板,该模板在构建项目时总是执行,为实体框架编译和写出EDMX文件。

无论Framework程序集是最新的还是需要构建的,EdmResources项目都会构建,这会大大减慢我们的构建过程。 我想要的是EdmResources只在框架程序集需要重新编译时才会生成。

我试着输出框架程序集的最后一次写入时间作为EdmResources.tt的输出,然后如果程序集上的最后一次写入时间大于记录在模板输出文件中的时间戳,那么只进行EDMX生成。

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

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

谢谢!


我找到了一个好的解决方案 我把这段代码放到顶部的我的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文件。

链接地址: http://www.djcxy.com/p/92429.html

上一篇: MSBuild timestamp issue with incremental build

下一篇: Get Visual Studio to run a T4 Template on every build