生成されたファイルを処理するようにビルドをカスタマイズする

どのビルドが指定されても、ビルド中に生成されたファイルは静的ファイル (ソース ファイルなど) とは異なるふるまいをします。 このため、MSBuild でプロジェクトをビルドするしくみを理解することが重要です。 2 つのフェーズは評価フェーズ実行フェーズです。 評価フェーズ中、MSBuild ではプロジェクトを読み取り、すべてをインポートし、プロパティを作成し、項目の glob を拡張し、ビルド プロセスを設定します。 実行フェーズ中、MSBuild では、評価フェーズ中に解析されたデータでターゲットとタスクを実行することでビルドを実行します。

実行中に生成されたファイルは評価フェーズ中は存在しないため、ビルド プロセスには含まれません。 この問題を解決するには、生成されたファイルをビルド プロセスに手動で追加する必要があります。 この方法として、次の例のように、BeforeBuild ターゲットの前に Content または None 項目に新しいファイルを追加することをお勧めします。

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

生成されたファイルを None または Content に追加すれば、ビルド プロセスで問題なく認識されます。 適切なタイミングで確実に追加することも望まれます。 理想的には、BeforeBuild の前にターゲットを実行します。 AssignTargetPaths は考えられるもう 1 つのターゲットです。新しい項目に変換される前に (他の項目と共に) None および Content 項目を変更する最終的な機会であるためです。 「共通項目の種類」を参照してください。