mardi 25 juin 2013

Moteur de Build Microsoft : MSBuild Engine (2)

Allons un peu plus loin dans le langage MSBuild.

Précédemment dans ce blog

Modification du fichier projet .csproj

Lors de la création d'un projet avec Visual Studio effectivement pour pouvoir éditer le .csproj il faut décharger le projet ensuite avec bouton-droit sur le projet décharger vous pouvez choisir "Editer le fichier .csproj".

En bas de ce fichier, vous trouvez le début de la personnalisation du processe de Build et le code suivant :

<!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
      Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->

Pour utiliser ce code, il suffit de le décommenter.

Customisation de Visual Studio pour MSBuild

Pour travailler plus efficacement car il va me falloir décharcher et recharger sans cesse le projet MyBuildProject.csproj afin de le modifier. J'ai envie de me créer une barre de boutons perso avec les deux boutons "Unload Project" et "Relaod Project".

J'obtiens la barre suivante :

Visual Studio - MyCustomBar avec les boutons "Unload" et "Relaod"

Exécution d'une Target (cible) spécifique de Build

En ajoutant les lignes suivantes dans mon fichier .csproj :

  <Target Name="HelloWorld">
    <Message Text="Hello"></Message>
    <Message Text="World"></Message>
  </Target>

J'ai ajouter une cible spécifique nommée "HelloWorld". Pour l'exécuter, j'ouvre la console commande de Visual Studio :

Exécution de MSBuild dans la console Visual Studio
Vous obtenez le résultat de l'exécution de la commande MSBuild :

>msbuild myProject.csproj /t:HelloWorld

Résultat de l'exécution de MSBuild dans la console Visual Studio
Les lignes :

Hello
World

apparaissent dans la console.

Remarque : l'exécution de MSBuild dans la console Visual Studio est plus verbose (plus parlante) que dans Visual Studio où l'on obtient le résultat suivant :

------ Build started: Project: MyBuildProject, Configuration: Debug x86 ------
  MyBuildProject -> E:\WPF Presentation Sample\MyBuildProject\MyBuildProject\bin\Debug\MyBuildProject.exe
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

Je n'ai donc exécuté que la target spécifique "HelloWorld" grâce au commutateur /t

Substitution et exécution des cibles MSBuild

J'ajoute maintenant les lignes suivantes dans mon fichier .csproj :

  <Target Name="BeforeBuild">
    <Message Text="Message BeforeBuild"></Message>
  </Target>
  <Target Name="AfterBuild">
    <Message Text="Message AfterBuild"></Message>
  </Target>

Et je j'exécute la commande :

>msbuild

Remarque : Que l'on ajoute ou non le nom du fichier .csproj, le résultat de la commande est le même. En fait si un seul fichier .csproj existe dans le répertoire alors MSBuild le prend par défaut et s'il y a plusieurs fichiers .csproj dans le répertoire alors MSBuild sort en erreur :

MSBuild - Exécution de la commande >msbuild dans la console de commande Visual Studio
J'obtiens bien mes deux messages :

Message BeforeBuild
Message AfterBuild

En suite, je vous propose de lire une page sur le site MSDN :
Comment : étendre le processus de génération Visual Studio

On y croisera l'ensemble des cibles que l'on peut substituer sans risque.

Subsitution de toutes les cibles MSBuild

Voici donc l'ensemble des cibles que l'on peut substituer sans risque :

BeforeCompile, AfterCompile
Les tâches insérées dans l'une de ces cibles s'exécutent avant ou après que la compilation principale a eu lieu. La plupart des personnalisations sont faites dans l'une de ces deux cibles.
BeforeBuild, AfterBuild
Les tâches insérées dans l'une de ces cibles s'exécutent avant ou après toutes les autres tâches de la génération.
Remarque : Les cibles BeforeBuild et AfterBuild sont déjà définies dans les commentaires à la fin de la plupart des fichiers projet. Vous pouvez ainsi ajouter facilement des événements avant génération et après génération à votre fichier projet.
BeforeRebuild, AfterRebuild
Les tâches insérées dans l'une de ces cibles s'exécutent avant ou après l'appel de la fonctionnalité de régénération principale. L'ordre de l'exécution cible dans Microsoft.Common.targets est le suivant : BeforeRebuild, Clean, Build, puis AfterRebuild.
BeforeClean, AfterClean
Les tâches insérées dans l'une de ces cibles s'exécutent avant ou après l'appel de la fonctionnalité de nettoyage principale.
BeforePublish, AfterPublish
Les tâches insérées dans l'une de ces cibles s'exécutent avant ou après l'appel de la fonctionnalité d'édition principale.
BeforeResolveReference, AfterResolveReferences
Les tâches insérées dans l'une de ces cibles s'exécutent avant ou après la résolution des références d'assembly.
BeforeResGen, AfterResGen
Les tâches insérées dans l'une de ces cibles s'exécutent avant ou après la génération des ressources.

L'ensemble des cibles substituables se trouve dans les fichiers :
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets

Erreur de la documentation :
En ouvrant le fichier Microsoft.Common.targets du Framework 4.0, on s'aperçoit qu'il y a une erreur dans la documentation : BeforeResolveReference s'écrit comme AfterResolveReferences avec un "s".

Par curiosité j'ai créé un fichier .csproj avec l'ensemble de ces cibles, j'obtiens l'exécution de MSBuild suivante :
MSBuild - Exécution de toutes les cibles substituables
On s'aperçoit que dans ce cas, elles ne sont pas toutes exécutées et l'on découvre l'ordre d'exécution logique des cibles de MSBuild.






Aucun commentaire:

Enregistrer un commentaire