自定义目标在TFS构建中第一次运行后被跳过

问题描述:

我在自己的构建中有一个自定义目标(一组副本任务),我需要调用几次才能在不同的地方进行更改。然而,这只在第一次被调用时运行,之后TFS将跳过所述目标。自定义目标在TFS构建中第一次运行后被跳过

的过程如下:

<!-- Copy some files to another location --> 
<CallTarget Targets="CopyFiles"></CallTarget> 

... 

<!-- Copy the above files to yet another location --> 
<CallTarget Targets="CopyFiles"></CallTarget> 

在生成日志,可以看出,目标“CopyFiles”跳过它被称为第二次:

Target "CopyLicenseManagerFiles" skipped. Previously built successfully.

这是为什么发生了什么?有没有办法强制目标(或我写的任何自定义目标)多次运行?

它应该每个MSBuild实例,每个参数集调用一次。在某些情况下,团队构建会分离MSBuild的单独实例(例如,如果您提供多个解决方案配置)。但是这可能对你没有帮助。

更适用于您的场景,如果您使用一组不同的参数调用MSBuild,它将重新运行一项任务。如果您正在复制两组不同的文件,这听起来就像您要查找的功能。

<MSBuild Project=".\CommonStuff.targets" Targets="CopyFiles" Properties="Location=1" /> 
<!-- .... --> 
<MSBuild Project=".\CommonStuff.targets" Targets="CopyFiles" Properties="Location=2" /> 

另一种解决方案是将功能重构为任务而不是目标。虽然仍然存在着陈述性与程序性的怪癖,但任务更接近于你所认为的来自更熟悉的语言的“功能”。

这是设计。目标不应被视为“方法”。 MSBuild更具说明性。因此,它会跟踪已执行的目标,并有目的地跳过已完成的目标。