次の方法で共有


MSBuild プロジェクト SDK の使用

.NET SDK などの開発テクノロジ スタックに必要なすべてのビルド インフラストラクチャは、プロジェクト SDKと総称される一連のプロパティとターゲットを特定の ID を用いて参照できます。 ID は、プロパティ定義を含む .props ファイルの特定のセットと、ターゲット定義を含む .targets ファイルに関連しています。 最上位のプロジェクト ノードの Sdk 属性を使用して、プロジェクト 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>

Microsoft から配布されている SDK は多数あります。 前の例で参照されているプロジェクト SDK のモニカーは Microsoft.NET.Sdk です。 .NET Core および .NET 5 以降に関連付けられているプロジェクト SDK については、「.NET プロジェクト SDK の概要」の一覧を参照してください。

プロジェクト 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 ファイルでバージョンが指定されている場合は、プロジェクトでバージョンを指定しないことをお勧めします。