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.