我有一个 MSBuild 文件,用于构建 */.sln 文件(构建所有存在的 .sln 文件)。
构建使用Build目标,因此如果没有对输入文件进行任何更改,则不应再次构建项目。
我想仅当项目实际再次构建时才执行一些自定义目标。
如何做到这一点?
无论编译/构建是否实际发生,AfterBuild和AfterCompile都会被调用。
最佳答案
基本上,您想要与 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 之后运行并检查这些时间戳。
关于.net - 仅当项目实际构建时才运行 MSBuild 目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13972820/