Share via


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.