複数のプロジェクト ファイルで同じターゲットを使用する

MSBuild プロジェクト ファイルをいくつか作成した経験があれば、同じタスクとターゲットを別のプロジェクト ファイルで使用する必要があることにお気付きでしょう。 すべてのプロジェクト ファイルにそれらのタスクやターゲットの完全な説明を追加する代わりに、個別のプロジェクト ファイルにターゲットを保存し、そのプロジェクトをそのターゲットを必要とする他のプロジェクトにインポートできます。

Import 要素を使用する

Import 要素は、あるプロジェクト ファイルを別のプロジェクト ファイルに挿入するために使用されます。 インポートされるプロジェクト ファイルは、有効な MSBuild プロジェクト ファイルであり、整形式の XML が含まれている必要があります。 Project 属性は、インポートされたプロジェクト ファイルのパスを指定します。 Import 要素の詳細については、「Import 要素 (MSBuild)」を参照してください。

プロジェクトをインポートするには

  1. インポートを行うプロジェクトのファイルで、インポートされるプロジェクトのプロパティとアイテムを対象に、パラメーターとして使用されるすべてのプロパティとアイテムを定義します。

  2. Import 要素を使用し、プロジェクトをインポートします。 たとえば次のような点です。

    <Import Project="MyCommon.targets"/>

  3. Import 要素に続き、インポートされるプロジェクトのプロパティとアイテムの既定の定義をオーバーライドするすべてのプロパティとアイテムを定義します。

評価の順序

MSBuild が Import 要素に到達すると、インポートされるプロジェクトは、Import 要素の場所で、インポートを行うプロジェクトに効果的に挿入されます。 そのため、Import 要素の場所は、プロパティとアイテムの値に影響を与えます。 インポートされるプロジェクトにより設定されるプロパティとアイテムとインポートされるプロジェクトで使用されるプロパティとアイテムを理解することが重要です。

プロジェクトをビルドするとき、すべてのプロパティが最初に評価され、続いてアイテムが評価されます。 たとえば、次の XML では、インポートされるプロジェクトファイル MyCommon.targets が定義されます。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Name>MyCommon</Name>
    </PropertyGroup>

    <Target Name="Go">
        <Message Text="Name=$(Name)"/>
    </Target>
</Project>

次の XML では、MyCommon.targets をインポートする、MyApp.proj が定義されます。

<Project
    DefaultTargets="Go"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Name>MyApp</Name>
    </PropertyGroup>
    <Import Project="MyCommon.targets"/>
</Project>

プロジェクトをビルドするとき、次のメッセージが表示されます。

Name="MyCommon"

プロジェクトはプロパティ NameMyApp.proj で定義された後にインポートされるため、MyCommon.targetsName の定義により MyApp.proj の定義がオーバーライドされます。 プロパティ Name が定義される前にプロジェクトがインポートされた場合、ビルドは次のメッセージを表示します。

Name="MyApp"

プロジェクトのインポート時に次のアプローチを使用する

  1. プロジェクトのファイルで、インポートされるプロジェクトのプロパティとアイテムを対象に、パラメーターとして使用されるすべてのプロパティとアイテムを定義します。

  2. プロジェクトをインポートします。

  3. プロジェクト ファイルで、インポートされるプロジェクトのプロパティとアイテムの既定の定義をオーバーライドするすべてのプロパティとアイテムを定義します。

例 1

次のコード例は、2 つ目のコード例でインポートされる MyCommon.targets ファイルを示しています。 .targets ファイルでは、インポートを行うプロジェクトからのプロパティを評価してビルドを構成します。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
        <Optimize Condition="'$(Flavor)'=='RETAIL'">yes</Optimize>
        <appname>$(MSBuildProjectName)</appname>
    <PropertyGroup>
    <Target Name="Build">
        <Csc Sources="hello.cs"
            Optimize="$(Optimize)"
            OutputAssembly="$(appname).exe"/>
    </Target>
</Project>

例 2

次のコード例では、MyCommon.targets ファイルをインポートします。

<Project DefaultTargets="Build"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Flavor>RETAIL</Flavor>
    </PropertyGroup>
    <Import Project="MyCommon.targets"/>
</Project>