Visual Studio执行clean命令触发绑定PrepareForBuild的自定义构建目标问题咨询
根本原因
- Xamarin 项目在 VS 2019 对应的 MSBuild 版本中,Clean 流程会隐式触发轻量的
PrepareForBuild执行,用于清理资源映射、中间生成的项目元数据。这个轻量执行的日志默认不会输出到主构建输出窗口,因此你看不到目标执行的日志,但目标确实被触发运行。 - 你定义的自定义目标没有添加场景过滤条件,只要
PrepareForBuild被触发,不管是正常构建场景、Clean 场景还是 VS 后台的设计时构建场景,都会执行,就出现了你遇到的异常触发问题。 - 调整为
AfterTargets="BeforeBuild"后不会在 Clean 时触发,是因为BeforeBuild默认仅在执行 Build 主目标的场景下才会被调用,Clean 上下文不会运行该目标。
解决方案
给自定义目标添加执行条件,过滤掉非构建场景即可,修改后的目标代码如下:
<Target Name="MyCustomTarget" AfterTargets="PrepareForBuild" Condition="'$(DesignTimeBuild)' != 'true' And '$(BuildingProject)' == 'true' And '$(IsClean)' != 'true'"> <Message Importance="high" Text="=== executing MyCustomTarget" /> <!-- do some file modifications --> </Target>
各条件的作用:
'$(DesignTimeBuild)' != 'true':过滤 VS 后台用于智能提示、属性面板渲染的设计时构建,避免编辑代码时目标被后台误触发'$(BuildingProject)' == 'true':仅在主动执行项目构建动作时运行目标'$(IsClean)' != 'true':明确排除 Clean 场景的执行
如果仍出现 Clean 时触发的情况,可以额外追加条件And '$(TargetName)' != 'Clean'进一步过滤。修改后目标仍然会在PrepareForBuild之后、BeforeBuild之前执行,完全符合你对执行时机的要求。
内容的提问来源于stack exchange,提问作者Jimmie
相关产品推荐
相关产品推荐

