只需通过引用一组属性和目标(统称为 项目 SDK )即可引用开发技术堆栈所需的所有生成基础结构,例如 .NET SDK。 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 Project SDK 概述中列出了与 .NET Core 和 .NET 5 及更高版本关联的项目 SDK。
引用项目 SDK
可通过三种方法引用项目 SDK:
使用 Sdk
元素上的 Project
属性
<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 的插件。 这些插件包括:
基于 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 只能使用一个版本。 如果引用同一项目 SDK 的两个不同版本,MSBuild 将发出警告。 如果 global.json文件中指定了版本,建议不要在项目中指定版本。
相关内容
- MSBuild 概念
- 自定义生成
- 包、元数据和框架
- .NET SDK 项目的 MSBuild 参考