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

lys*_*cid 6 .net msbuild build-process build msbuild-4.0

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

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

我想只在项目实际上再次构建时才执行一些自定义目标.

如何才能做到这一点?

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

sti*_*ijn 10

基本上你想要与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>
Run Code Online (Sandbox Code Playgroud)

这就是发生的事情:当有一个命名属性RunPostBuildEvent与值OnOutputUpdatedCoreBuild目标的dependncies前和生成后最终将记录其输出文件的时间戳.如果它们相等,则输出不会构建.所以剩下的就是让目标运行CoreBuild并检查这些时间戳.