Dostosowywanie kompilacji do obsługi wygenerowanych plików

W każdej kompilacji pliki generowane podczas kompilacji zachowują się inaczej niż pliki statyczne (takie jak pliki źródłowe). Z tego powodu ważne jest, aby zrozumieć , jak projekty msbuild kompilują. Dwie fazy to faza oceny i faza wykonywania. Podczas fazy oceny program MSBuild odczytuje projekt, importuje wszystko, tworzy właściwości, rozszerza globy dla elementów i konfiguruje proces kompilacji. W fazie wykonywania program MSBuild wykonuje kompilację, uruchamiając elementy docelowe i zadania z danymi analizowanych w fazie oceny.

Pliki generowane podczas wykonywania nie istnieją w fazie oceny, dlatego nie są uwzględniane w procesie kompilacji. Aby rozwiązać ten problem, należy ręcznie dodać wygenerowane pliki do procesu kompilacji. Zalecanym sposobem, aby to zrobić, jest dodanie nowego pliku do Content elementów lub None przed obiektem docelowym, jak w poniższym przykładzie BeforeBuild :

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

Dodanie wygenerowanego pliku do None lub Content jest wystarczające, aby proces kompilacji go wyświetlił. Chcesz również upewnić się, że jest dodawany w odpowiednim czasie. Najlepiej, aby element docelowy był uruchamiany przed BeforeBuild. AssignTargetPaths jest innym możliwym celem, ponieważ jest to ostateczna możliwość modyfikacji None i Content elementów (między innymi) przed ich przekształceniem w nowe elementy. Zobacz Typowe typy elementów.