Partager via


Personnaliser une build pour gérer les fichiers générés

Dans une build donnée, les fichiers générés pendant le processus de build se comportent différemment des fichiers statiques (par exemple les fichiers sources). C’est pourquoi il est important de comprendre comment MSBuild génère des projets. Les deux phases sont la phase d’évaluation et la phase d’exécution. Pendant la phase d’évaluation, MSBuild lit votre projet, importe tout, crée des propriétés, développe des modèles Glob pour les éléments et configure le processus de build. Lors de la phase d’exécution, il effectue le processus de build en exécutant les cibles et les tâches avec les données qu’il a analysées au cours de la phase d’évaluation.

Les fichiers générés pendant l’exécution n’existent pas pendant la phase d’évaluation. Ils ne sont donc pas inclus dans le processus de build. Pour résoudre ce problème, vous devez les ajouter manuellement dans le processus de build. Pour ce faire, nous vous recommandons d’ajouter le nouveau fichier aux éléments Content ou None avant la cible BeforeBuild, comme dans l’exemple suivant :

<Target Name="MyTarget" BeforeTargets="BeforeBuild">
  
  <!-- Some logic that generates your file goes here -->
  <!-- Generated files should be placed in $(IntermediateOutputPath) -->

  <ItemGroup>
    <!-- If your generated file was placed in `obj\` -->
    <None Include="$(IntermediateOutputPath)my-generated-file.xyz" CopyToOutputDirectory="PreserveNewest"/>
    <!-- If you know exactly where that file is going to be, you can hard code the path. -->
    <None Include="some\specific\path\my-generated-file.xyz" CopyToOutputDirectory="PreserveNewest"/>
    
    <!-- If you want to capture "all files of a certain type", you can glob like so. -->
    <None Include="some\specific\path\*.xyz" CopyToOutputDirectory="PreserveNewest"/>
    <None Include="some\specific\path\*.*" CopyToOutputDirectory="PreserveNewest"/>
  </ItemGroup>
</Target>

Il suffit d’ajouter le fichier généré à None ou Content pour que le processus de build le voie. Assurez-vous également qu’il est ajouté au bon moment. Dans l’idéal, votre cible s’exécute avant BeforeBuild. AssignTargetPaths constitue une autre cible possible, car il s’agit de la dernière occasion de modifier les éléments None et Content (entre autres) avant qu’ils ne soient transformés en de nouveaux éléments. Cf. Types d’éléments courants.