7

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

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

仅当项目实际上再次构建时,我才想执行一些自定义目标。

如何才能做到这一点?

无论编译/构建是否实际发生,都始终调用AfterBuildAfterCompile 。

4

1 回答 1

11

基本上你想要与例如相同的行为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将记录输出文件在构建之前和之后的时间戳。如果它们相等,则不会生成输出。所以剩下的就是让你的目标运行并检查这些时间戳。OnOutputUpdatedCoreBuildCoreBuild

于 2012-12-20T14:53:13.837 回答