首页 > 解决方案 > 如何使用 Visual Studio 和 MSBuild 进行确定性构建?

问题描述

我已经达到了可以在 Visual Studio 2019 中重复构建并具有确定性构建的地步……与使用 MSBuild v16 在命令行上构建时相同。不幸的是,使用 VS2019 构建时输出的程序集与使用 MSBuild 构建时不同。

我理解确定性构建过程的概念,以及编译器在做出选择时考虑的无数因素。我需要做的是弄清楚 Visual Studio 在编译过程中到底在做什么,以便我可以使用 MSBuild 进行复制。据我所见,Visual Studio 绕过 MSBuild 并直接进入编译器(这并没有让这变得更容易)。

有没有人尝试过这个并取得了成功?也许您尝试过并放弃了?两者的答案同样有帮助。

提前致谢。

标签: c#visual-studiomsbuilddeterministic

解决方案


如何使用 Visual Studio 和 MSBuild 进行确定性构建?

实际上,要构建 C# 项目,VS IDE 调用MSBuild来构建项目。VS IDE调用MSBuild构建项目,本身与命令行编译的MSBuild一致。MSBuild 存在 C:\Program Files (x86)\Microsoft Visual Studio\2019\xxxx\MSBuild\Current\Bin于 VS2019 文件夹下。

只是VS IDE集成了很多工具。如果在 VS IDE 中安装一些与构建相关的扩展或工具,可能会影响最终构建。MSBuild(命令行)是一个纯编译工具,VS IDE会调用它来构建。

--------------------------

首先,我想知道您是否使用VS IDE及其VS 的开发人员命令提示符(存在于 VS2019 IDE 下)分别构建您的项目。如果是这样,我认为您应该确保命令行参数是否与 VS IDE 中的构建参数一致。

首先,请在Extensions --> Manage Extensions下禁用任何第三方扩展,以防它们影响 VS IDE 中的 MSBuild。

然后,确保在构建项目时,应注意每个项目的配置DebugRelease)或平台x64)。x86Any CPU

然后你应该在 MSBuild 命令行中执行这些操作:

msbuild xxxx.csproj -t:build -p:Configuration=xxx -p:Platform=xxx

确保构建说明是一致的。

--------------------------

、在另一个单代理中使用VS2019的Build Tool时(可以不使用VS IDE单独安装),如果是这样,请确保其版本与VS IDE相同。(Build Tool版本v16.xxx与VS IDE相同) version v16.xxx)而且不同版本的 MSBuild 的 build 会略有不同,所以要保持一致。

实际上,MSBuild 构建 c# 项目时使用csc.exe编译文件,因此 VS IDE 和 MSBuild 对于 c# 文件是一致的。不同的编译器使用csc.

另外,要查看更多细节:可以通过这种方式查看详细的构建日志:

VS IDE中:

Tools--> Options--> Projects and Solutions--> Build and Run--> 设置MSBuild project build output verbosityDetailed.

MSBuild中:

msbuild xxxx.csproj -t:build -p:Configuration=xxx -p:Platform=xxx -v:detailed

推荐阅读