首次在TFS构建中运行后,将跳过自定义目标

时间:2009-09-11 23:24:04

标签: tfs msbuild msbuild-task tfsbuild

我的构建中有一个自定义目标(一组复制任务),我需要调用几次以在不同的地方进行更改。但是,这仅在第一次调用时运行,之后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.

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

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

另一个解决方案是将功能重构为Task而不是Target。虽然仍然存在声明性和程序性的怪癖,但是任务与更熟悉的语言中的“功能”更接近。