Share via


Anpassen eines Builds zum Verarbeiten generierter Dateien

In jedem Build verhalten sich Dateien, die während des Builds generiert werden, anders als statische Dateien (z. B. Quelldateien). Aus diesem Grund ist es wichtig zu verstehen, wie MSBuild Projekte erstellt. Die beiden Phasen sind die Auswertungsphase und die Ausführungsphase. Während der Auswertungsphase liest MSBuild Ihr Projekt, importiert alles, erstellt Eigenschaften, erweitert Globs für Elemente und richtet den Buildprozess ein. Während der Ausführungsphase führt MSBuild den Build durch Ausführen von Zielen und Tasks mit den Daten aus, die während der Auswertungsphase analysiert wurden.

Während der Ausführung generierte Dateien sind während der Auswertungsphase nicht vorhanden, daher sind sie nicht im Buildprozess enthalten. Um dieses Problem zu beheben, müssen Sie die generierten Dateien manuell im Buildprozess hinzufügen. Die empfohlene Methode hierfür besteht darin, die neue Datei zu den Content- oderNone-Elementen vor dem BeforeBuild-Ziel hinzuzufügen, wie im folgenden Beispiel gezeigt:

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

Das Hinzufügen Ihrer generierten Datei zu None oder Content reicht für den Buildvorgang aus, um sie zu erkennen. Sie möchten auch sicherstellen, dass sie zur richtigen Zeit hinzugefügt wird. Idealerweise wird Ihr Ziel vor BeforeBuild ausgeführt. AssignTargetPaths ist ein weiteres mögliches Ziel, da es die endgültige Möglichkeit ist, None- und Content-Elemente (unter anderem) zu ändern, bevor sie in neue Elemente transformiert werden. Weitere Informationen finden Sie unter Allgemeine Elementtypen.