仅在实际构建项目时运行MSBuild目标

时间:2012-12-20 13:03:27

标签: .net build msbuild build-process msbuild-4.0

我有一个MSBuild文件,用于构建* / .sln文件(构建所有存在的.sln文件)。

构建使用 Build 目标,因此如果没有对输入文件进行任何更改,则不应再次构建项目。

我想执行一些自定义目标,只有项目实际上再次构建。

如何做到这一点?

无论编译/构建是否实际发生,都始终会调用 AfterBuild AfterCompile

1 个答案:

答案 0 :(得分:9)

基本上你想要与PostBuildEvent相同的行为,所以我查看Microsoft.Common.Targets是如何做到的(这个文件总是提供了一个很好的洞察msbuild的方法应该被使用)。这是解决方案:

<PropertyGroup>
  <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
</PropertyGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="RunWhenBuild" AfterTargets="CoreBuild"       
        Condition="'$(_AssemblyTimestampBeforeCompile)'!='$(_AssemblyTimestampAfterCompile)'">
  <Message Importance="high" Text="RunWhenBuild!!"/>
</Target>

这是继续发生的事情:当有一个名为RunPostBuildEvent的属性值为OnOutputUpdated时,CoreBuild目标的依赖关系将最终记录输出文件之前和之后的时间戳构建。如果它们相等,则输出不会构建。所以剩下的就是让你的目标在CoreBuild之后运行并检查这些时间戳。