2

我的构建中有一个自定义目标(一组复制任务等),我需要调用几次才能在不同位置进行更改。但是,这只在第一次调用时运行,之后 TFS 构建会跳过所述目标。

过程如下:

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

...

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

在构建日志中,可以看到目标“CopyFiles”在第二次调用时被跳过:

目标“CopyLicenseManagerFiles”被跳过。之前搭建成功。

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

4

2 回答 2

4

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

于 2009-09-12T01:54:00.373 回答
3

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

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

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

另一种解决方案是将功能重构为任务而不是目标。虽然仍然存在声明性与程序性的怪癖,但任务的行为更接近您认为的更熟悉的语言中的“函数”。

于 2009-09-12T22:58:56.143 回答