Les cibles personnalisées sont ignorées après la première exécution dans la construction TFS

StackOverflow https://stackoverflow.com/questions/1413698

Question

J'ai dans ma version une cible personnalisée (un groupe de tâches de copie, par exemple) que je dois appeler plusieurs fois pour effectuer des changements à différents endroits. Cependant, cela ne fonctionne que lors de la première utilisation, après quoi la construction de TFS ignore ladite cible.

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 construction, il est indiqué que la cible "CopyFiles" est sauté la deuxième fois, il est appelé:

Target "CopyLicenseManagerFiles" skipped. Previously built successfully.

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

Était-ce utile?

La solution

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 plus d'une configuration de solution). Mais cela ne vous aidera probablement pas.

Plus applicable à votre scénario, MSBuild réexécutera une tâche si vous l'appelez avec un jeu de paramètres différent. 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 décalages déclaratifs et procéduraux, les tâches se comportent beaucoup plus près de ce que vous appelez une "fonction". à partir de langues plus familières.

Autres conseils

C'est par conception. Les cibles ne doivent pas être considérées comme des "méthodes". MSBuild est plus déclaratif. Donc, il garde une trace des cibles qui ont été exécutées et ignore délibérément celles qui ont déjà été complétées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top