dotnet.exe 与 nuget.exe 的误解

Misunderstanding of dotnet.exe vs nuget.exe

我对 NuGet 关于 dotnet.exenuget.exe 之间差异的文档感到非常困惑。让我谈谈我对整个.NET 生态系统的理解,并介绍我感到困惑的地方:

好的,我们有了 .NET,它是一个用于构建各种应用程序的框架。 .NET 有几个 实现 - 即 .NET Framework 版本 1 - 4.8,然后是 .NET Core 1.0 - 3.1,然后是 .NET 5+。

除此之外,我们还有所谓的“.NET 标准”——它是实现符合的 API 规范,因此为特定标准编写的应用程序肯定可以 运行 在任何实现上符合此版本的 .NET Standard。

每个用 .NET 编写的应用程序或库都指定了它的目标TargetFramework。这意味着此应用程序只能 运行 这些 .NET 实现。

到目前为止还好吗?

现在,我们有了 NuGet,它是 .NET 项目的包管理器。 NuGet 有 2 个 CLI 工具,在介绍它们时,文档告诉我们 dotnet.exe 是这样的:

CLI tool for .NET Core and .NET Standard libraries, and for any SDK-style project such as one that targets .NET Framework. Included with the .NET Core SDK and provides core NuGet features on all platforms. ...

好的 - “对于 .NET Core 和 .NET Standard 库”是什么意思?这是否意味着应该使用 dotnet.exe 打包面向 .NET Core 和 .NET Standard 的库?

此外 - “任何 SDK 风格的项目,例如以 .NET Framework 为目标的项目”是什么意思?也许我没有正确理解英语 - 这是否意味着“任何 SDK 风格的项目”,并且以 .NET Framework 为目标的项目总是这样的项目?或者它的意思是“任何以 .NET Framework 为目标的 SDK 风格的项目”?我真的没听懂。项目是 SDK 项目还是非 SDK 项目与其目标 .NET 实现之间是否存在关系?

dotnet(Windows 上的dotnet.exe)CLI 工具提供了 nuget 功能。它开箱即用,适用于所有 .NET Core、.NET Standard 和 .NET >= 5 项目。您应该能够使用 dotnet 工具打包任何面向 .NET Core、.NET 5 或更新版本以及 .NET Standard 的项目。 nuget 仍然有效,但 dotnet 更简单、更“常见”,并且在这方面有更好的文档。


.NET 已经使用项目文件很长时间了。 “SDK-style 项目文件”是传统项目文件的新变体,与.NET Core 一起使用,.NET >= 5.

您可以通过在 Project xml 元素中标记项目文件或添加单独的 SDK 来表明项目文件是 SDK-style 项目] 元素,甚至 Importing 一个 Sdk.props 文件。

.NET Core 和 .NET >= 5 默认是 SDK 风格的项目。 .NET Framework 项目不是,您已明确将它们迁移到 SDK-style。

换句话说,如果你想使用 dotnet 将东西打包为 nuget 并且你正在使用 .NET Framework 应用程序,你需要在你之前迁移到新的 SDK-style 项目可以使用 dotnet 创建 nuget 包。

更多信息:https://docs.microsoft.com/en-us/dotnet/core/project-sdk/overview