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