2009-09-11 9 views
2

J'ai une cible personnalisée (un groupe de tâches de copie, entre autres) dans ma construction que j'ai besoin d'appeler plusieurs fois pour effectuer des changements dans différents endroits. Cependant, ceci ne s'exécute que la première fois qu'il est appelé, après quoi la construction TFS saute la dite cible.Les cibles personnalisées sont ignorées après la première exécution dans la construction TFS

Le processus se déroule comme suit:

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

... 

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

Dans le journal de la construction, on voit que la cible « CopyFiles » est sauté la deuxième fois qu'il est appelé:

Target "CopyLicenseManagerFiles" skipped. Previously built successfully.

Pourquoi est-ce événement? Existe-t-il un moyen de forcer la cible (ou toute cible personnalisée que j'écris) à s'exécuter plusieurs fois?

Répondre

3

Il doit être appelé une fois par instance MSBuild, par jeu de paramètres. Team Build supprime des instances distinctes de MSBuild dans certaines circonstances (par exemple si vous fournissez plusieurs configurations de solution). Mais cela ne vous aide probablement pas.

Plus applicable à votre scénario, MSBuild réexécutera une tâche si vous l'appelez avec un ensemble différent de paramètres. Si vous copiez deux ensembles de fichiers différents, cela ressemble à la fonctionnalité que vous recherchez.

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

L'autre solution consiste à refactoriser la fonctionnalité dans une tâche au lieu d'une cible. Bien qu'il existe encore des bizarreries déclaratives et procédurales, les tâches se comportent beaucoup plus près de ce que vous considérez comme une «fonction» de langues plus familières.

3

Ceci est voulu. Les cibles ne doivent pas être considérées comme des "méthodes". MSBuild est plus déclaratif. Ainsi, il garde la trace des cibles qui ont été exécutées et saute délibérément celles qui ont déjà été complétées.

Questions connexes