生成されたファイルを処理するようにビルドをカスタマイズする
どのビルドが指定されても、ビルド中に生成されたファイルは静的ファイル (ソース ファイルなど) とは異なるふるまいをします。 このため、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
項目を変更する最終的な機会であるためです。 「共通項目の種類」を参照してください。