自定义目标在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更具说明性。因此,它会跟踪已执行的目标,并有目的地跳过已完成的目标。