2010-11-22 40 views
2

J'ai une bibliothèque de tâches MSBuild personnalisées que je modifie régulièrement, en refactorisant le code, en ajoutant de nouvelles tâches et en supprimant celles qui étaient anciennes. C'est devenu difficile d'éditer le fichier .Targets à synchroniser avec ce qui est réellement dans la bibliothèque, alors je me demandais, quelle serait la meilleure façon d'automatiser cela?Générer par programme un fichier MSBuild .Targets personnalisé

Je voudrais une solution qui s'exécute après la construction de la bibliothèque, de sorte que je ne reçois pas d'erreurs désagréables lorsque j'essaie d'appeler mes tâches personnalisées à partir d'autres projets.

J'ai quelques idées sur la façon de faire cela, mais j'aimerais voir ce que les autres proposent d'abord. :-)

Répondre

0

Eh bien, je l'ai trouvé une plus belle façon d'y parvenir en utilisant MSBuild Community Task « s tâche TaskSchema:

<TaskSchema Assemblies="@(MyTaskAssembly)" 
      OutputPath="%(MyTaskAssembly.RootDir)%(MyTaskAssembly.Directory)" 
      CreateTaskList="true" 
      IgnoreMsBuildSchema="true" 
      Includes="Microsoft.Build.Commontypes.xsd"/> 

j'assurer simplement que j'ai importé le fichier MSBuild.Community.Tasks.Targets , créez un ItemGroup nommé MyTaskAssembly contenant tous mes assemblys de tâches (shocker), puis collez l'appel de tâche ci-dessus dans la cible AfterBuild de mon projet. Doux! :)

1

Vous pouvez avoir un fichier .targets distinct contenant uniquement des références à vos tâches. D'un côté, reliez-le dans votre fichier principal .targets. De l'autre, remplacez-le en exécutant une autre tâche personnalisée "maître" dans votre cible AfterBuild de la solution des tâches. Cette tâche "maître" obtiendra toutes les classes implémentant ITask depuis l'assemblage nouvellement construit et les écrira dans le fichier .targets.
Mais pour être honnête, cela ressemble à une exagération pour moi. Vous devez quand même éditer votre fichier .targets pour utiliser vos nouvelles tâches. Écrire une telle tâche «maîtresse» et la soutenir peut vous prendre plus de temps. Je peux fantasmer sur plusieurs autres solutions automatisées, mais les considérations de «temps investi»/«temps gagné en raison de l'automatisation» arrêtent le vol de mon imagination. =)

+0

J'ai trouvé une solution utilisant PowerShell, la réflexion d'assemblage et XML. Je cours le script PowerShell dans la cible AfterBuild du projet et le fichier .Targets est créé comme prévu. Cela ne me semble pas une solution élégante, cependant ... Des pensées à ce sujet, ou des alternatives? =) –

+0

Vous pouvez déplacer les .Targets que vous avez créés avec Powershell et la réflexion dans un chemin (réseau) auquel tout développeur peut accéder. Ensuite, dans votre script de construction de projets, vous faites toujours référence à votre fichier "maître" .Targets. Quant à utiliser Powershell et la réflexion, cela ne me semble pas inélégant. Vous pouvez également utiliser des commentaires XML au lieu de la réflexion, mais cela nécessitera plus de travail. –