Personalizzare una compilazione per gestire i file generati

In una determinata compilazione, i file generati durante la compilazione si comportano in modo diverso dai file statici ,ad esempio i file di origine. Per questo motivo, è importante comprendere in che modo MSBuild compila progetti. Le due fasi sono la fase di valutazione e la fase di esecuzione. Durante la fase di valutazione, MSBuild legge il progetto, importa tutto, crea proprietà, espande i glob per gli elementi e configura il processo di compilazione. Durante la fase di esecuzione, MSBuild esegue la compilazione eseguendo destinazioni e attività con i dati analizzati durante la fase di valutazione.

I file generati durante l'esecuzione non esistono durante la fase di valutazione, pertanto non sono inclusi nel processo di compilazione. Per risolvere questo problema, è necessario aggiungere manualmente i file generati nel processo di compilazione. Per eseguire questa operazione, è consigliabile aggiungere il nuovo file agli Content elementi o None prima della BeforeBuild destinazione, come nell'esempio seguente:

<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>

L'aggiunta del file generato a None o Content è sufficiente per visualizzare il processo di compilazione. Si vuole anche assicurarsi che venga aggiunto al momento giusto. Idealmente, la destinazione viene eseguita prima di BeforeBuild. AssignTargetPaths è un'altra possibile destinazione, poiché è l'opportunità finale di modificare None e Content elementi (tra gli altri) prima che vengano trasformati in nuovi elementi. Vedere Tipi di elementi comuni.