http://sedodream.com/2012/05/14/MSBuildHowToExecuteATargetAfterCoreCompile.aspxでこれをブログに書きましたが、以下にコンテンツを貼り付けました。
私は今日 StackOverflow を使用していて、次の行に沿った質問に気付きました。 CoreCompile がスキップされるときは?」以下は私の答えです。
これは一般的なケースでは解決が難しい問題ですが、CoreCompile にはこのシナリオに対する特別なサポートが組み込まれているため、このケースでは非常に簡単です。CoreCompile を使用してこれを実現する方法の詳細に入る前に、それが一般的にどのように機能するかを説明しましょう。
一般的なケースの説明
MSBuild では、インクリメンタル ビルドが原因でターゲットがスキップされます。インクリメンタル ビルドは、ターゲット自体の入力および出力属性から純粋に駆動されます。入力はターゲットが「使用」するファイルのリストであり、出力はターゲットによって「生成」されるファイルのリストです。引用符を使用しているのは、具体的な概念ではなく大まかな概念であるためです。簡単にするために、入力/出力をファイルのリストとして扱うことができます。ターゲットが実行されようとしているとき、MSBuild は入力を受け取り、それらのタイムスタンプを出力と比較します。すべての出力が入力より新しい場合、ターゲットはスキップされます。(参考までに、一部の出力のみが古くなっている場合に何が起こるかを知りたい場合は、http://sedodream.com/2010/09/23/MSBuildYouveHeardOfIncrementalBuildingButHaveYouHeardOfPartialBuilding にある私のブログをお読みください。
いずれにせよ、ターゲットをスキップしたい場合は、入力/出力を正しく作成する必要があります。あなたの場合、CoreCompile がスキップされるたびにターゲットをスキップしたいので、表面的には CoreCompile の入力/出力を単純にコピーできるように見えますが、それは機能しません。CoreCompile が実行されたときにファイルが古くなっている可能性がありますが、そのターゲット自体がファイルを最新の状態にするため、機能しません。次に、ターゲットが実行されると、それらはすべて最新であるためスキップされます。入力/出力をコピーし、ターゲットが作成する入力/出力に追加のファイルを追加する必要があります。これにより、最初のパスでターゲットがスキップされなくなります。
CoreCompile の特定のソリューション
プロジェクト ファイルを見ると、下部に Microsoft.Common.targets ファイルがインポートされていることがわかります。このファイルは、言語固有の .targets ファイルをインポートします。たとえば、Microsoft.CSharp.targets または Microsoft.VisualBasic.targets のいずれかをインポートします (C# または VB を使用している場合)。これらの .targets ファイルには、CoreCompile が定義されています。CoreCompile の定義では、最後に次のように表示されます。
<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>
これにより、プロパティで定義されたすべてのターゲットが呼び出されTargetsTriggeredByCompilation
ます。したがって、CoreCompile が実行されるたびにターゲットが呼び出されるようにする場合は、そのプロパティを拡張できます。これを行う方法は次のとおりです。
<PropertyGroup>
<TargetsTriggeredByCompilation>
$(TargetsTriggeredByCompilation);
MyCustomTarget
</TargetsTriggeredByCompilation>
</PropertyGroup>
<Target Name="MyCustomTarget">
<Message Text="MyCustomTarget called" Importance ="high"/>
</Target>
この場合、プロパティTargetsTriggeredByCompilationを定義し、それに MyCustomTargetを追加します。$(TargetsTriggeredByCompilation);を含めることが非常に重要です。そうしないと、追加ではなく上書きされます。したがって、他の誰かがこの手法を使用した場合、そのターゲットを一掃します。
以下は、一度ビルドして CoreCompile と MyCustomTarget を実行した場所を示す画像です。次に、2 番目のビルド CoreCompile がスキップされ、MyCustomTarget が呼び出されることはありません。