作为项目引用时,NuGet 与 SDK 的对比

本文旨在帮助开发人员选择是将其软件打包为 NuGet 包还是软件开发工具包(SDK)。 具体而言,它讨论了在 Visual Studio 项目中引用两者之间的差异。

  • NuGet 是一种开源包管理系统,简化了将库合并到项目中的过程。 对于 .NET(包括 .NET Core),NuGet 是共享代码Microsoft支持的机制。 NuGet 定义如何创建、托管和使用 .NET 的包,并为其中每个角色提供工具。 在 Visual Studio 中,使用 包管理器 用户界面将 NuGet 包添加到项目。

  • SDK 是 Visual Studio 视为单个引用项的文件集合。 Visual Studio 中的“引用管理器”对话框列出了选择 添加引用时与当前项目相关的所有 SDK。 将 SDK 添加到项目时,可以通过 IntelliSense、工具箱窗口、设计器、对象浏览器、MSBuild、部署、调试和打包访问该 SDK 的所有内容。

我应使用哪种机制?

下表可帮助你将 SDK 的引用功能与 NuGet 的引用功能进行比较。

功能 SDK 支持 SDK 说明 NuGet 支持 NuGet 说明
该机制引用一个实体,然后提供所有文件和功能。 Y 通过使用 引用管理器 对话框,您可以添加 SDK,所有文件和功能在整个开发工作流程中都可用。 Y
MSBuild 自动处理程序集和 Windows 元数据(.winmd)文件。 Y SDK 中的引用会自动传递给编译器。 Y
MSBuild 会自动使用 .h 或 .lib 文件。 Y SDKName.props 文件告知 Visual Studio 如何设置 Visual C++ 目录等,以便自动使用 .h.lib 文件。 N
MSBuild 会自动使用 .js.css 文件。 Y 在解决方案资源管理器 中,可以展开 JavaScript SDK 引用节点以显示单个 .js.css 文件,然后通过将这些文件拖动到源文件来生成 <source include/> 标记。 SDK 支持 F5 和自动包设置。 Y
MSBuild 会自动在 工具箱中添加控件。 Y “工具箱”可使用 SDK 并在指定的选项卡中显示控件。 N
该机制支持用于扩展的 Visual Studio 安装程序(VSIX)。 Y VSIX 具有用于创建 SDK 包的特殊清单和逻辑 Y VSIX 可以嵌入到另一个安装程序中。
对象浏览器 枚举所有引用。 Y 对象浏览器 会自动获取 SDK 中的引用列表并枚举它们。 N
将自动将文件和链接添加到 引用管理器 对话框(帮助链接等自动填充) Y 引用管理器 对话框会自动枚举 SDK,以及帮助链接和 SDK 依赖项列表。 N NuGet 提供其自身的“管理 NuGet 包”对话框。
该机制支持多个体系结构。 Y SDK 可以交付多个配置。 MSBuild 针对每个项目配置使用相应的文件。 N
该机制支持多个配置。 Y SDK 可以交付多个配置。 根据项目体系结构,MSBuild 针对每个项目体系结构使用相应的文件。 N
该机制可以指定“不复制”。 Y 可控制将哪些文件复制到正在使用的应用程序的包中,这具体取决于文件置于 \redist 还是 \designtime 文件夹中 N 您在包清单中指定要复制的文件。
内容存在于本地化文件中。 Y SDK 中的本地化 XML 文档会自动包含在内,以便获得更好的设计时体验。 N
MSBuild 支持同时使用多个版本的 SDK。 Y SDK 支持同时使用多个版本。 N 这不会引用。 项目中不能同时存在多个版本的 NuGet 文件。
该机制支持指定适用的目标框架、Visual Studio 版本和项目类型。 Y 引用管理器 对话框和 工具箱 仅显示应用于项目的 SDK,以便用户可以更轻松地选择相应的 SDK。 Y (部分) 透视是目标框架。 用户界面上没有筛选功能。 在安装时,可能会返回错误。
该机制支持为本机 WinMD 指定注册信息。 Y 可以在 .winmd 文件和 SDKManifest.xml中的 .dll 文件之间指定相关性。 N
该机制支持指定对其他 SDK 的依赖项。 Y SDK 仅通知用户;用户仍必须安装并手动引用它们。 Y NuGet 会自动获取它们,不会通知用户。
该机制与Microsoft应用商店概念(如应用清单和框架 ID)集成。 Y SDK 必须传递特定于应用商店的概念,以便包装和 F5 可以与应用商店提供的 SDK 一起正常工作。 N
该机制与 Windows 8.x 应用商店应用的应用调试管道集成。 Y SDK 必须传递特定于应用商店的概念,以便包装和 F5 可以与应用商店提供的 SDK 一起正常工作。 Y NuGet 内容将成为项目的一部分。 无需特殊的 F5 考虑。
该机制与应用清单集成。 Y SDK 必须传递特定于应用商店的概念,以便包装和 F5 可以与应用商店提供的 SDK 一起正常工作。 Y NuGet 内容将成为项目的一部分。 无需特殊的 F5 考虑。
该机制部署非引用文件(例如,部署运行 Windows 8.x 应用商店应用测试的测试框架)。 Y 如果在 \redist 文件夹中删除文件,则会自动部署文件。 Y
该机制会自动在 Visual Studio IDE 中添加平台 SDK。 Y 如果将 Windows 8 SDK 或 Windows Phone SDK 拖放到具有特定布局的特定位置,则 SDK 会自动与所有 Visual Studio 功能集成。 N
该机制支持干净的开发者计算机。 (也就是说,无需安装,从源代码控制进行简单检索即可。 N 由于引用了 SDK,因此您必须分别提交您的解决方案和 SDK。 可以从 MSBuild 迭代 SDK 的两个非注册表默认位置签入 SDK(有关详细信息,请参阅 创建软件开发工具包)。 或者,如果自定义位置由 SDK 组成,则可以在项目文件中指定以下代码:

<PropertyGroup>
  <SDKReferenceDirectoryRoot>
  C:\MySDKs
  </SDKReferenceDirectoryRoot>
</PropertyGroup>

然后将 SDK 签入该位置。
Y 您可以下载并查看解决方案,Visual Studio 会立即识别并处理这些文件。
您可以加入一个已经存在的大型软件包作者社区。 N/A 社区是新增功能。 Y
你可以加入一个现有大型软件包用户社区。 N/A 这是一个新的社区。 Y
可以加入合作伙伴生态系统(自定义库、存储库等)。 N/A 可用的存储库包括 Visual Studio Marketplace、Microsoft下载中心和Microsoft应用商店。 Y
该机制与持续集成生成服务器集成,用于包创建和使用。 Y SDK 必须将命令行上的签入位置(SDKReferenceDirectoryRoot 属性)传递给 MSBuild。 Y
该机制支持稳定和预发行包版本。 Y SDK 支持添加对多个版本的引用。 Y
该机制支持对已安装的包进行自动更新。 Y 如果作为 VSIX 或 Visual Studio 自动更新的一部分提供,SDK 会提供自动通知。 Y
该机制包含用于创建和使用包的独立 .exe 文件。 Y SDK 包含 MSBuild.exe Y
包可签入到版本控制。 Y 无法签入“文档”节点外的任何内容,这意味着可能无法签入扩展 SDK。 扩展 SDK 的大小可能很大。 Y
可以使用 PowerShell 接口创建和使用包。 Y (消耗),N (创建) 没有用于创建 SDK 的工具。 使用在命令行上正在执行 MSBuild。 Y
可以使用符号包进行调试支持。 Y 如果将 .pdb 文件放入 SDK 中,系统会自动识别这些文件。 Y
该机制支持包管理器自动更新。 N/A SDK 使用 MSBuild 进行修改。 Y
该机制支持轻型清单格式。 Y SDKManifest.xml 支持许多属性,但通常需要一个小子集。 Y
该机制适用于所有 Visual Studio 版本。 Y SDK 支持所有 Visual Studio 版本。 Y NuGet 支持所有 Visual Studio 版本。