これに対する答えをhttp://sedodream.com/2012/07/28/MSBuildHowToExecuteATargetAfterCoreCompilePart2.aspxでブログに書きましたが、以下に解決策を貼り付けました。
数か月前、私はブログ投稿MSBuildに、CoreCompileの後にターゲットを実行する方法を書きました。ここでは、CoreCompileターゲットが実行された場合、CoreCompileがスキップされた場合、他のターゲットもスキップされた場合にターゲットを実行する方法について説明します。以前の投稿で概説したアプローチの欠点は、.csproj / .vbproj/etcファイル自体を編集する必要があることでした。したがって、複数のプロジェクトを構築するシナリオがある場合は、すべてのプロジェクトファイルを編集する必要があります。この投稿では、プロジェクトファイル自体を編集せずに同じカスタマイズを実行する方法について説明します。
この特定のケースの解決策に入る前に、C#およびVBプロジェクトが持つ拡張性フックについて説明します。C#およびVBプロジェクトをビルドするためのロジックのほとんどは、C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319\Microsoft.Common.targetsにあるMSBuildターゲットファイルにキャプチャされています。そのファイルを見ると、上部に次のようなインポートが表示されます。
<Import Project="$(CustomBeforeMicrosoftCommonTargets)" Condition="'$(CustomBeforeMicrosoftCommonTargets)' != '' and Exists('$(CustomBeforeMicrosoftCommonTargets)')"/>
プロパティが空でなく、ファイルが存在する場合、このステートメントはファイル(CustomBeforeMicrosoftCommonTargetsの値にあります)をインポートします。CustomBeforeMicrosoftCommonTargetsのデフォルト値は、C:\ Program Files(x86)\ MSBuild \ v4.0\Custom.Before.Microsoft.Common.targetsです。したがって、その場所にMSBuildファイルをドロップすると、そのマシンでビルドされたすべてのC#/VBプロジェクトのビルドプロセスが変更されます。または、必要がない場合(または、ACLが原因でできない場合)は、ファイルを別の場所にドロップしてから、CustomBeforeMicrosoftCommonTargetsプロパティをオーバーライドしてその場所を指定できます。これが私がここでとるアプローチです。ProjAとProjBの2つのプロジェクトで構成されるサンプルソリューションを作成しました。このためのビルドを自動化するためのビルドスクリプトbuild.projもあります。以下はbuild.projの全内容です。
build.proj
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<FileToInject Condition=" '$(FileToInject)'=='' ">$(MSBuildThisFileDirectory)extend-corecompile.proj</FileToInject>
</PropertyGroup>
<ItemGroup>
<ProjectsToBuild Include="ProjA\ProjA.csproj"/>
<ProjectsToBuild Include="ProjB\ProjB.csproj"/>
</ItemGroup>
<Target Name="Build">
<MSBuild Projects="@(ProjectsToBuild)"
Properties="CustomBeforeMicrosoftCommonTargets=$(FileToInject)" />
</Target>
<Target Name="Clean">
<MSBuild Projects="@(ProjectsToBuild)" Targets="Clean"/>
</Target>
<Target Name="Rebuild" DependsOnTargets="Clean;Build"/>
</Project>
上記のビルドターゲットでは、MSBuildタスクを使用してProjAとProjBの両方をビルドします。ご覧のとおり、extend-corecompile.projを指すプロパティCustomBeforeMicrosoftCommonTargets = $(FileToInject)を渡しています。ProjAおよびProjBのビルド時にこのプロパティを渡すことにより、ビルドプロセス用にextend-corecompile.projファイルが自動的にインポートされます。以下にextend-corecompile.projの内容を示します。
extend-corecompile.proj
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetsTriggeredByCompilation>
$(TargetsTriggeredByCompilation);
MyCustomTarget
</TargetsTriggeredByCompilation>
</PropertyGroup>
<Target Name="MyCustomTarget">
<Message Text="MyCustomTarget called" Importance ="high"/>
</Target>
</Project>
このプロジェクトファイルは、以前のブログ投稿で概説した手法を使用して、CoreCompileが実行された場合にのみMyCustomTargetを実行します。
注:このサンプルの最新バージョンは、 https://github.com/sayedihashimi/sayed-samples/tree/master/ExtBuildMultipleで入手できます。