使用 dotnet 和 MsBuild 构建 .NET 应用程序有什么区别?
What's the difference between using dotnet and MsBuild for building .NET applications?
我第一次不得不在不使用 Visual Studio 的情况下进行一些构建,显然我对 MsBuild 和构建过程的了解存在差距。
那么,下面这两个构建过程有什么区别呢?
选项 1:
dotnet build C:\Dev\trunk\Mvc.sln
此选项使用“构建引擎版本 16.8.3+39993bd9d for .NET”- 我认为这意味着这种方式可用于 .NET Core,因为它没有引用“框架”?
选项 2:
msbuild C:\Dev\trunk\Mvc.sln
此选项使用“构建引擎版本 16.8.2+25e4d540b for .NET Framework”。
我的假设是“dotnet build”命令只是使用 MsBuild 的一种 shorthand 方式。但是,两者提供的日志记录非常不同,它们都产生不同的结果。
Roslyn——C# 编译器平台——是一个 .NET Standard 2.0 库,这意味着它可以 运行 在 .NET Framework 4.6.1+ 和 .NET Core 2.0+ 上(1).
Visual Studio,其中包括 .NET Framework 上的 MSBuild,运行s。当您使用 Visual Studio(或直接使用 MSBuild)构建项目时,它 运行s Roslyn on .NET Framework。 Visual Studio 知道如何处理 SDK 样式的 csprojs 和遗留的非 SDK 样式的 csprojs,并相应地调用 Roslyn。使用的 Roslyn 版本与 Visual Studio 版本相关联。
dotnet build
是一个单独的工具,是一个 .NET Core 应用程序。它只知道如何构建 SDK 样式的 csprojs,并且它通过 运行ning Roslyn on .NET Core 来实现。 Roslyn 随 .NET Core SDK 一起分发,dotnet build
从这些已安装的 SDK 版本之一(通常是最新版本)加载 Roslyn。
这两种构建 C# 项目的方法或多或少是等效的,它们调用相同的编译器代码。但是,它们在可以 运行 的位置有所不同(Visual Studio 是 .NET Framework 而 Windows-only,dotnet build
是 .NET Core 并且可以 运行 在多个平台),以及他们是否可以构建遗留的非 SDK 样式的 csprojs。 dotnet build
从命令行使用也更好一些。
请注意,加载 Roslyn 的运行时间与 Roslyn 可以发出的已编译 IL 无关:.NET Framework 上的 Roslyn 运行ning 可以发出由 .NET 执行的 IL。 NET Core 就好了,反之亦然。
如果您使用的分析器以 .NET Core 为目标(不太可能,因为我们鼓励分析器以 .NET Standard 2.0 为目标),这些分析器只会 dotnet build
。
(1) 我使用“.NET Core”来指代 .NET Core 和 .NET 5+。
我第一次不得不在不使用 Visual Studio 的情况下进行一些构建,显然我对 MsBuild 和构建过程的了解存在差距。
那么,下面这两个构建过程有什么区别呢?
选项 1:
dotnet build C:\Dev\trunk\Mvc.sln
此选项使用“构建引擎版本 16.8.3+39993bd9d for .NET”- 我认为这意味着这种方式可用于 .NET Core,因为它没有引用“框架”?
选项 2:
msbuild C:\Dev\trunk\Mvc.sln
此选项使用“构建引擎版本 16.8.2+25e4d540b for .NET Framework”。
我的假设是“dotnet build”命令只是使用 MsBuild 的一种 shorthand 方式。但是,两者提供的日志记录非常不同,它们都产生不同的结果。
Roslyn——C# 编译器平台——是一个 .NET Standard 2.0 库,这意味着它可以 运行 在 .NET Framework 4.6.1+ 和 .NET Core 2.0+ 上(1).
Visual Studio,其中包括 .NET Framework 上的 MSBuild,运行s。当您使用 Visual Studio(或直接使用 MSBuild)构建项目时,它 运行s Roslyn on .NET Framework。 Visual Studio 知道如何处理 SDK 样式的 csprojs 和遗留的非 SDK 样式的 csprojs,并相应地调用 Roslyn。使用的 Roslyn 版本与 Visual Studio 版本相关联。
dotnet build
是一个单独的工具,是一个 .NET Core 应用程序。它只知道如何构建 SDK 样式的 csprojs,并且它通过 运行ning Roslyn on .NET Core 来实现。 Roslyn 随 .NET Core SDK 一起分发,dotnet build
从这些已安装的 SDK 版本之一(通常是最新版本)加载 Roslyn。
这两种构建 C# 项目的方法或多或少是等效的,它们调用相同的编译器代码。但是,它们在可以 运行 的位置有所不同(Visual Studio 是 .NET Framework 而 Windows-only,dotnet build
是 .NET Core 并且可以 运行 在多个平台),以及他们是否可以构建遗留的非 SDK 样式的 csprojs。 dotnet build
从命令行使用也更好一些。
请注意,加载 Roslyn 的运行时间与 Roslyn 可以发出的已编译 IL 无关:.NET Framework 上的 Roslyn 运行ning 可以发出由 .NET 执行的 IL。 NET Core 就好了,反之亦然。
如果您使用的分析器以 .NET Core 为目标(不太可能,因为我们鼓励分析器以 .NET Standard 2.0 为目标),这些分析器只会 dotnet build
。
(1) 我使用“.NET Core”来指代 .NET Core 和 .NET 5+。