这与该问题非常相似,除了问题外,我在为VS2013修复它后,MSBUILD上存在该问题。即使编译器和链接器认为项目是最新的,构建后事件也正在运行。
关于如何防止构建后事件在此处运行的任何想法?
1>Project "D:\XXX\XXX\XXX\XXX.vcxproj" on node 1 (default targets).
1>InitializeBuildStatus:
Creating ".\..\XXX\XXX\XXX\XXX.39DEE505.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.\
ClCompile:
All outputs are up-to-date.
All outputs are up-to-date.
ResourceCompile:
All outputs are up-to-date.
Link:
All outputs are up-to-date.
WpnSiteOverlayManager.vcxproj -> D:\XXX\XXX\XXX\XXX\..\bin\Release\XXX.dll
PostBuildEvent:
"..\..\..\Components\DevTools\Build\BuildCommand.exe" /p "..\..\..\Products" "D:\XXX
....
buildcommand completed successfully
FinalizeBuildStatus:
Deleting file ".\..\intermediate\release\XXX\XXX.39DEE505.tlog\unsuccessfulbuild".
Touching ".\..\intermediate\release\XXX\XXX.39DEE505.tlog\XXX.lastbuildstate".
1>Done Building Project "D:\XXX\XXX\XXX\XXX.vcxproj" (default targets).
此功能内置在MsBuild for .Net项目中(在Microsoft.Common.Targets中搜索PostBuildEvent,也请参见此处),这是简化版本。原则是在构建之前获得输出文件的时间戳,在构建之后获得另一个时间戳,然后进行比较。如果它们相同,则显然没有真正构建任何东西。这个逻辑有很多可能的插入点,在这里我刚刚选择了链接阶段,它应该做得很好:
<Target Name="GetTimeStampBeforeLink" BeforeTargets="Link">
<ItemGroup>
<ProjectOutputFiles Include="$(TargetPath)" />
</ItemGroup>
<PropertyGroup>
<OutputTimeStampBeforeLink>%(ProjectOutputFiles.ModifiedTime)</OutputTimeStampBeforeLink>
</PropertyGroup>
</Target>
<Target Name="GetTimeStampAfterLink" AfterTargets="Link">
<PropertyGroup>
<OutputTimeStampAfterLink>%(ProjectOutputFiles.ModifiedTime)</OutputTimeStampAfterLink>
<OutputFilesModified Condition="'$(OutputTimeStampBeforeLink)' != '$(OutputTimeStampAfterLink)'">True</OutputFilesModified>
</PropertyGroup>
</Target>
您可以将此代码直接插入到项目文件中,但是更好的主意是将其保存在单独的文件中,以便将其导入到其他项目中,从而可以通过将其导入到任何位置来重复使用。您也可以通过添加到ProjectOutputFiles
ItemGroup来添加要检查的文件。
现在剩下的就是禁用PostBuildEvent。MsBuild已经有了一种机制,因为后构建事件的调用取决于名为的PostBuildEventUseInBuild
属性,因此如果未修改输出文件,则将其设置为false:
<Target Name="DisablePostBuildEvent" AfterTargets="GetTimeStampAfterLink">
<PropertyGroup>
<PostBuildEventUseInBuild Condition='"$(OutputFilesModified)' != 'True'">false</PostBuildEventUseInBuild>
</PropertyGroup>
</Target>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句