1

我正在努力解决以下问题,但我不明白。我有一个 Visual Studio Xamarin 项目(Windows 10 上的 VS 2019)。在项目文件中,我定义了一个自定义构建目标:

<Target Name="MyCustomTarget" AfterTargets="PrepareForBuild">
  <Message Importance="high" Text="=== executing MyCustomTarget" />
  <!-- do some file modifications -->
</Target>

我希望它始终在预定义的 PrepareForBuild 目标之后运行。当我构建项目时,我的目标被执行并且我在构建输出中看到它(我的自定义消息也显示了一些文件按照目标中的定义进行了更新)。

问题是当我为项目执行“clean”命令时,我的自定义目标也会执行(甚至可能多次!)。在这种情况下,我在输出日志中看不到我的消息(MSBuild 详细程度在选项中设置为诊断),目标也未列在任务性能摘要中,但它已执行(我的文件已更新)。这是我不明白的事情。当 clean 被调用时,PrepareForBuild 目标也不会被执行。为什么即使调用 clean 我的目标也会执行?

如果我将我的任务更改为在 BeforeBuild 之后执行,那么它不会在执行 clean 时被调用,但我需要它在 BeforeBuild 之后更早地执行。

4

1 回答 1

0

请参阅设计时构建文档:VS 在设计时运行相当多的目标并使事情变得更复杂,这取决于所使用的项目系统。这回答了关于发生了什么的问题,即使只是加载项目 VS 将运行您的目标。该链接还提到了可以做些什么:

<Target Name="MyCustomTarget" AfterTargets="PrepareForBuild" Condition="'$(DesignTimeBuild)' != 'true' AND '$(BuildingProject)' == 'true'">
  <Message Importance="high" Text="=== executing MyCustomTarget" />
</Target>

另一种方法是寻找一个在设计时从不运行但不是很容易的目标(可以手动检查构建日志并尝试一些目标,或者使用项目系统工具之类的东西来启用二进制设计时日志记录并与正常比较构建以查看使用了哪些目标)

但是,文档还提到:

动态更改引用、源文件或编译选项的目标必须在设计时构建期间运行,以避免 Visual Studio 中出现意外行为

因此,根据您正在做的事情,实际上最好保持原样。

于 2021-11-22T10:28:54.413 回答