c# - 如何使用 Visual Studio 和 MSBuild 进行确定性构建?
问题描述
我已经达到了可以在 Visual Studio 2019 中重复构建并具有确定性构建的地步……与使用 MSBuild v16 在命令行上构建时相同。不幸的是,使用 VS2019 构建时输出的程序集与使用 MSBuild 构建时不同。
我理解确定性构建过程的概念,以及编译器在做出选择时考虑的无数因素。我需要做的是弄清楚 Visual Studio 在编译过程中到底在做什么,以便我可以使用 MSBuild 进行复制。据我所见,Visual Studio 绕过 MSBuild 并直接进入编译器(这并没有让这变得更容易)。
有没有人尝试过这个并取得了成功?也许您尝试过并放弃了?两者的答案同样有帮助。
提前致谢。
解决方案
如何使用 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。
然后,确保在构建项目时,应注意每个项目的配置(Debug
或Release
)或平台(或x64
)。x86
Any 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 verbosity
为Detailed
.
在MSBuild中:
msbuild xxxx.csproj -t:build -p:Configuration=xxx -p:Platform=xxx -v:detailed
推荐阅读
- asp.net-mvc - 检查 Azure 作业的整体进度并将其发送到 ASP.NET 视图
- laravel - 如何挂钩 laravel nova 中资源的删除事件?
- laravel - CamelCase 类型控制器的视图文件夹的命名约定是什么
- php - 我的 Unicode 保护方案是否完整?是否有保护 Unicode 字符串的内置方法?
- html - 如何从带有空格的图像名称中删除+号
- moodle - 成功用户登录后moodle无效响应
- json - 如何使用 mongo-go-driver 有效地将 bson 转换为 json?
- c# - Asp.Net MVC 从 Dropdownlist 获取值到 PartialView
- azure - 如何安全地存储连接字符串客户端 ID 等?
- mongodb - MongoDb 和 POSTMAN:文档未添加到集合中