我的构建中有一个自定义目标(一组复制任务),我需要调用几次以在不同的地方进行更改。但是,这仅在第一次调用时运行,之后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实例调用一次。在某些情况下,Team Build会分离出MSBuild的单独实例(例如,如果您提供多个解决方案配置)。但这可能对你没有帮助。

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

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

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top