我有一个构建 */.sln 文件的 MSBuild 文件(构建所有存在的 .sln 文件)。
构建使用构建目标,因此如果未对输入文件进行任何更改,则不应再次构建任何项目。
我想执行一些自定义目标 仅当 一个项目实际上又被构建了。
如何才能做到这一点?
两者 AfterBuild 和 编译后总是被调用,无论编译/构建是否实际发生。
最佳答案
基本上你想要与 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
target 的依赖最终会记录构建前后输出文件的时间戳。如果它们相等,则不会生成输出。所以剩下的就是让你的目标在 CoreBuild
之后运行并检查这些时间戳。
关于.net - 仅在实际构建项目时运行 MSBuild 目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13972820/