Définir dynamiquement la liste des solutions à compiler dans Team Build

Imaginons un projet dans lequel on a plusieurs Solutions Visual Studio (« c’est pas bien » me dirait Mathieu , mais ça arrive quand même :). On décide de labéliser les sources « v1.0 » à un moment du développement et on travaille ensuite sur la version v2.0. Lors du développement de cette version, on ajoute une solution qui doit bien évidemment également être compilée, donc on l’ajoute à la liste des solutions dans le script Team build.

Si à ce moment on veut recompiler la version v1.0, rien de plus simple n’est-ce pas ? On exécute la build avec comme paramètre : /p:GetVersion=Lv1.0. Et bien non… Même si Team Build récupère bien la version labélisée « v1.0 » des sources il se base sur la dernière version du script (TFSBuild.proj) (même si le fichier .proj est labélisé !) et lorsqu’il essaye de compiler la nouvelle solution, celle-ci n’existe pas !

Je sais qu’on a la possibilité de brancher par rapport au label, d’inclure le fichier TFSBuild.proj à la branche et de recréer un type de build utilisant ce fichier (dont la « dernière version » sera alors correcte par rapport aux sources) mais avouez que ça fait beaucoup d’opérations pour compiler une version, non ? C’est ce que je me suis dis aussi.

La solution est relativement simple : il suffit d’externaliser la liste des solutions à builder dans un fichier XML qui sera versionné et labélisé avec le reste des sources et de charger dynamiquement la liste des solutions pendant l’exécution de la build.

Première étape : Créer ce fichier (qu’on pourra nommer « SolutionList.xml »), qui ressemblera à ceci :

<SolutionList>

  <Solution>[Chemin]/Solution1.sln</Solution>

  <Solution>[Chemin]/Solution2.sln</Solution>

  <Solution>[Chemin]/Solution3.sln</Solution>

</SolutionList>

Deuxième étape : Ecrire une Target dans le script TeamBuild qui créé dynamiquement une collection d’items nommée « SolutionToBuild » (nom attendu par le script de build) :

<Target Name="GenerateSolutionList">

    <XMLQuery           XPath="//Solution"

           XmlFileName="$(SolutionRoot)\SolutionList.xml">

      <Output

              TaskParameter="Value"

              PropertyName="SolutionToBuild"/>

    </XMLQuery>

 

</Target>

 

La tâche XMLQuery fait partie du framework MSBuild Community Tasks de tigris (http://msbuildtasks.tigris.org/). Elle permet de lire le contenu d’un fichier XML à partir d’une requête Xpath et retourne le(s) résultat(s) dans une collection d'items.

A partir de là, on se retrouve avec une collection d’items nommée comme celle utilisée par Team Build pour la compilation des solutions. Reste une question cruciale : Quand appeler cette Target « GenerateSolutionList » ?

Pas n’importe quand. Il faut savoir que le script Team Build se rappelle lui-même via la tâche <MSBuild /> à divers moment. Hors les items groups définis lors de l’exécution d’un script par MSBuild ne sont pas transmis au contexte MSBuild appelant. Ceci implique que créer la liste avant que Team Build l’utilise n’est pas suffisant, il faut se greffer au bon moment dans le cycle de vie du script. Ce « bon moment », c’est juste avant que Team Build ne génère la liste des configurations à builder, en surchargeant la target « BeforeCompileConfiguration » comme ceci :

<Target Name="BeforeCompileConfiguration">

    <CallTarget Targets="GenerateSolutionList" />

</Target>

Ca y est, vous avez une liste de solutions versionnée !

L’exemple ci-dessus est volontairement simple, mais il suffit de peu de choses pour ajouter les métadonnées nécessaires à la collection d’items pour préciser notamment la configuration à compiler (Release, Debug, etc.), la plateforme cible, etc.

En espérant ne pas être le seul à être confronté à des développement de produits à solution multiples ! J

.Dispose();

Publié mercredi 14 janvier 2009 15:25 par Etienne Margraff
Classé sous , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: Définir dynamiquement la liste des solutions à compiler dans Team Build @ jeudi 15 janvier 2009 11:19

Excellent ! :-)

Adrien Siffermann


Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01