MSBuild プロジェクト SDK の使用

MSBuild 15.0 では、"プロジェクト SDK" という概念が導入されました。これによって、プロパティとターゲットをインポートする必要があるソフトウェア開発キットの使用が簡単になります。

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>net46</TargetFramework>
    </PropertyGroup>
</Project>

プロジェクトの評価中に、MSBuild によってプロジェクト ファイルの先頭と末尾に暗黙的なインポートが追加されます。

<Project>
    <!-- Implicit top import -->
    <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />

    <PropertyGroup>
        <TargetFramework>net46</TargetFramework>
    </PropertyGroup>

    <!-- Implicit bottom import -->
    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>

プロジェクト SDK を参照する

プロジェクト SDK を参照するには、次の 3 つの方法があります。

<Project/> 要素の Sdk 属性を使用する

<Project Sdk="My.Custom.Sdk">
    ...
</Project>

前述のように、暗黙的なインポートがプロジェクトの先頭と末尾に追加されます。

特定のバージョンの SDK を指定するには、それを Sdk 属性に追加します。

<Project Sdk="My.Custom.Sdk/1.2.3">
    ...
</Project>

最上位の <Sdk/> 要素を使用する

<Project>
    <Sdk Name="My.Custom.Sdk" Version="1.2.3" />
    ...
</Project>

前述のように、暗黙的なインポートがプロジェクトの先頭と末尾に追加されます。

Version 属性は必要ありません。

プロジェクトの任意の場所で <Import/> を使用する

<Project>
    <PropertyGroup>
        <MyProperty>Value</MyProperty>
    </PropertyGroup>
    <Import Project="Sdk.props" Sdk="My.Custom.Sdk" />
    ...
    <Import Project="Sdk.targets" Sdk="My.Custom.Sdk" />
</Project>

プロジェクトに明示的にインポートを含めることで、順序を完全に制御できます。

<Import/> 要素を使用する場合は、省略可能な Version 属性も指定できます。 たとえば、 <Import Project="Sdk.props" Sdk="My.Custom.Sdk" Version="1.2.3" />を指定できます。

警告

<Import/> 要素を使用するようにプロジェクトを変更する場合は、.props.targets インポートの両方を追加し、<Project/> 要素と <Sdk/> 要素から SDK を削除してください。 そうしないと、二重にインポートされ、MSB4011 警告が表示されます。

プロジェクト SDK の解決方法

インポートを評価すると、MSBuild では、指定した名前とバージョンに基づいてプロジェクト SDK へのパスが動的に解決されます。 また、MSBuild には、登録済み SDK リゾルバーの一覧もあります。SDK リゾルバーは、マシン上にあるプロジェクト SDK の場所を特定するプラグインです。 たとえば、次のプラグインがあります。

  • NuGet ベースのリゾルバー。指定した SDK の ID とバージョンに一致する、NuGet パッケージ用に構成されたパッケージ フィードのクエリを実行します。

    このリゾルバーは、オプションのバージョンを指定した場合にのみアクティブになります。 任意のカスタム プロジェクト SDK に使用できます。

  • .NET SDK リゾルバー。.NET SDK と共にインストールされた MSBuild SDK を解決します。

    このリゾルバーにより、製品の一部である Microsoft.NET.SdkMicrosoft.NET.Sdk.Web などのプロジェクト SDK の場所が特定されます。

  • 既定のリゾルバー。MSBuild と共にインストールされた SDK を解決します。

NuGet ベースの SDK リゾルバーでは、global.json ファイルでバージョンを指定することができます。これによって、個々のプロジェクトではなく、ある場所内のプロジェクト SDK のバージョンを制御できます。

{
    "msbuild-sdks": {
        "My.Custom.Sdk": "5.0.0",
        "My.Other.Sdk": "1.0.0-beta"
    }
}

ビルド中には、各プロジェクト SDK の 1 つのバージョンのみを使用できます。 同じプロジェクト SDK の 2 つの異なるバージョンを参照すると、MSBuild から警告が生成されます。 global.json ファイルでバージョンが指定されている場合は、プロジェクトでバージョンを指定しないことをお勧めします。