Personalizar um build para manipular arquivos gerados
Em qualquer build específico, os arquivos gerados durante o build se comportam de forma diferente dos arquivos estáticos (como arquivos de origem). Por esse motivo, é importante entender Como o MSBuild compila projetos. As duas fases são a fase de avaliação e a fase de execução. Durante a fase de avaliação, o MSBuild lê seu projeto, importa tudo, cria propriedades, expande globs para itens e configura o processo de build. Durante a fase de execução, o MSBuild realiza o build executando destinos e tarefas com os dados analisados durante a fase de avaliação.
Os arquivos gerados durante a execução não existem durante a fase de avaliação, portanto, eles não são incluídos no processo de build. Para resolver esse problema, você deve adicionar manualmente os arquivos gerados ao processo de build. A maneira recomendada de fazer isso é adicionando o novo arquivo aos itens Content
ou None
antes do destino BeforeBuild
, como no exemplo a seguir:
<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>
Adicionar o arquivo gerado a None
ou Content
é suficiente para que o processo de build o veja. Você também vai querer garantir que ele seja adicionado no momento certo. O ideal é que seu destino seja executado antes do BeforeBuild
. AssignTargetPaths
é outro destino possível, pois é a oportunidade final de modificar os itens None
e Content
(entre outros) antes de serem transformados em novos itens. Consulte Tipos de itens comuns.