MSBuild 开源仓库全指南:从零构建、本地化、测试与调试微软构建引擎
构建工具开发工具CLI【免费下载链接】msbuildThe Microsoft Build Engine (MSBuild) is the build platform for .NET and Visual Studio.项目地址https://gitcode.com/gh_mirrors/ms/msbuild点击查看免费下载MSBuildMicrosoft Build Engine是 .NET 与 Visual Studio 的官方构建平台它以 XML 项目文件描述构建过程既能被 Visual Studio 作为内部引擎调用也能脱离 Visual Studio 独立运行。本文以仓库根目录 README.md 为骨架结合eng/、src/、documentation/下的源码与文档系统讲解如何在本仓库中完成 Windows / Unix 下的源码构建、本地化构建、单元测试与断点调试并剖析各核心组件与引导bootstrap机制帮助读者从零搭建可运行、可调试、可测试的 MSBuild 开发环境。MSBuild 是什么引擎、XML 项目文件与两种运行形态微软构建引擎Microsoft Build Engine即 MSBuild是一个构建应用程序的平台。它提供了一套XML Schema项目文件用于控制构建平台如何处理和构建软件。Visual Studio 使用 MSBuild 作为其构建引擎但 MSBuild 本身并不依赖 Visual Studio 才能运行——只要在项目或解决方案文件上调用msbuild.exe就能在没有安装 Visual Studio 的环境中编排并完成产品构建。这一“引擎 XML 项目文件 可独立执行”的模型是理解整个仓库的起点仓库根目录的 README.md 将 MSBuild 定位为“a platform for building applications”并明确其核心抽象是“an XML schema for a project file that controls how the build platform processes and builds software”。在仓库源码中这一模型由以下代码结构直接承载命令行入口MSBuildApp位于 src/MSBuild/XMake.cs负责解析命令行参数并调用构建引擎其ExitType枚举定义了从成功、参数错误、构建失败到客户端异常等完整的退出语义。引擎主类BuildManager位于 src/Build/BackEnd/BuildManager/BuildManager.csBeginBuild等 API 是引擎对外暴露的构建入口既服务于MSBuild.exe也被 Visual Studio 等宿主进程通过Microsoft.Build命名空间编程式调用。各版本的详细变更记录见 documentation/Changelog.md例如 17.0.0 版本随 Visual Studio 2022 17.0.0 与 .NET SDK 6.0.100 发布起 MSBuild 面向 .NET Framework 4.7.2 与 .NET 6.0 构建并在 Visual Studio 构建中默认使用 64 位 MSBuild。从源码构建 MSBuild在 Windows 上用 Visual Studio 2026 构建完整支持路径官方推荐在 Windows 上使用最新的 Visual Studio 2026获得完整支持体验步骤如下安装 Visual Studio 2026并勾选 .vsconfig 中列出的组件。该文件内容如下本质上是声明了“.NET desktop development”托管桌面开发工作负载{ version: 1.0, components: [ Microsoft.VisualStudio.Workload.ManagedDesktop ] }安装.NET Framework 3.5完整构建的输出依赖它详见下文“为什么要 .NET Framework 3.5”一节。在 Windows 系统层面启用长路径支持。打开Developer Command Prompt for VS 2026开发者命令提示符。克隆源码git clone https://github.com/dotnet/msbuild如尚未安装 Git需先下载。在仓库根目录运行.\build.cmd构建代码该命令同时会还原打开项目所需的 NuGet 包。在 Visual Studio 2026 中打开解决方案文件MSBuild.slnx或轻量筛选文件MSBuild.Dev.slnf。构建完成后新构建的 MSBuild 位于artifacts\bin\bootstrap\net472\MSBuild\Current\Bin\MSBuild.exeREADME 特别提醒这个新构建的 MSBuild可能不适用于所有场景包括 C 构建。build.cmd与 Arcade 构建流水线仓库根目录的 build.cmd 是一个薄封装它把-?//?归一化为-help随后调用eng\build.ps1并透传参数powershell -ExecutionPolicy ByPass -NoProfile -Command %~dp0eng\build.ps1 -restore -build %_args%真正的构建逻辑在 eng/build.ps1 中它基于Arcade SDK见 global.json 中声明的Microsoft.DotNet.Arcade.Sdk实现了一个两阶段stage1 → stage2引导构建Stage 1 先构建出 “bootstrap” 产物作为构建工具用于 Stage 2Stage 2 用 Stage 1 的产物MSBuild.exe或 bootstrap 的dotnet.exe重新构建整个仓库形成“用自己构建自己”的自举闭环若指定了-test测试只在多阶段构建的 Stage 2 中运行两阶段分别生成Build.binlog与Build.stage2.binlog避免二进制日志互相覆盖-stage2Argument用于仅传给 Stage 2 的开关例如/mt多线程构建参数注释说明需等待镜像中存在稳定版本后再传给 Stage 1。eng/build.ps1中还可看到若干实用环境变量的设置MSBUILDDONOTLAUNCHDEBUGGERtrue让 Debug 位快速失败而非挂起等待调试器DOTNET_PERFLOG_DIR开启性能日志DOTNET_HOST_PATH/DOTNET_INSTALL_DIR指向 bootstrap 的 .NET 宿主使测试进程与任务宿主都使用刚构建出的产物。在 UnixmacOS 与 Linux上构建MSBuild 可以在支持 .NET Core 的 Unix 系统上运行。完整的环境准备与调试说明参见 documentation/wiki/Building-Testing-and-Debugging-on-.Net-Core-MSBuild.md要点如下最简单的路径先安装最新的 .NET SDK它会自动满足本仓库构建所需的全部前置条件。手动安装依赖OSX 与 Ubuntu构建过程会用到 .NET CLI而 CLI 依赖/usr/lib下的 OpenSSL 库。macOS 可用brew install opensslUbuntu 可用apt-get install openssl。若看到Unable to load DLL System.Security.Cryptography.Native错误说明dotnet没有找到正确位置的 OpenSSL 库。构建命令直接运行./build.sh。该脚本build.sh会先解析自身符号链接以获得仓库真实根目录然后调用eng/build.sh --restore --build。测试命令./build.sh --test运行仓库内全部测试。该文档同时声明MSBuild 可在 Windows、OS X 10.13、Ubuntu 14.04、Ubuntu 16.04 上成功构建。为什么不构建源码也能拿到 .NET Core MSBuild如果不打算修改 MSBuild 源码最简单的获取方式是安装 .NET Core SDK——它内部分发 MSBuild。安装后既可以通过dotnet build使用 MSBuild也可以直接手动调用 dotnet 发行目录中的MSBuild.dll。构建前置条件再深入为什么要 .NET Framework 3.5documentation/wiki/Building-Testing-and-Debugging-on-Full-Framework-MSBuild.md 解释了一个容易踩坑的原因MSBuildTaskHost.exe仍以 .NET Framework 3.5 为目标较新的 .NET SDK 或 .NET Framework 4.x 无法替代它。因此要在 Windows 上完成完整构建必须安装 .NET Framework 3.5所有命令行操作都应从Developer Command Prompt for VS 2026执行。解决方案文件MSBuild.slnx与MSBuild.Dev.slnf仓库采用新的 XML 解决方案格式MSBuild.slnx根目录 MSBuild.slnx其中声明了 Any CPU / ARM64 / x64 / x86 四个平台并按 Folder 组织包、示例、测试等工程。MSBuild.Dev.slnfMSBuild.Dev.slnf则是面向日常开发筛选后的解决方案筛选器仅包含核心工程src/Build/Microsoft.Build.csproj引擎本体src/Framework/Microsoft.Build.Framework.csproj框架接口src/MSBuild/MSBuild.csproj命令行入口src/Tasks/Microsoft.Build.Tasks.csproj内置任务src/Utilities/Microsoft.Build.Utilities.csproj工具类以及上述各模块对应的单元测试工程build.cmd /p:CreateBootstrapfalse与引导机制默认.\build.cmd会生成bootstrap 目录——它模拟一个 Visual Studio 安装环境从包或本机例如 Visual Studio 的 props/targets获取额外依赖Roslyn 编译器、NuGet 等。若不需要可运行.\build.cmd /p:CreateBootstrapfalse关闭。bootstrap 的设计动机详见 documentation/wiki/Bootstrap.md本仓库的二进制与构建逻辑不足以构建真实世界项目需要一套模拟 .NET SDK 与 Visual Studio 中“MSBuild Roslyn 编译器 其他组件”真实组合的测试环境。对于 .NET 目标引导阶段通过安装脚本下载与当前版本兼容的完整 .NET SDK 到 bootstrap 目录逻辑封装在InstallDotNetCoreTask.cs中随后把新构建的 MSBuild 二进制复制进去得到的 SDK 同时用于本地端到端测试与 CI 运行。其代价是首次构建需要联网下载 SDK后续运行只会在请求的 SDK 版本发生变化时重新下载。本地化构建Localization开启本地化构建在命令行传入/p:LocalizedBuildtrue即可开启本地化构建。完整的本地化机制说明见 documentation/wiki/Localization.md。本地化资源的结构中性neutral资源以.resx文件存放共享资源位于Microsoft.Build.Framework程序集的SR.resx中其他 MSBuild 程序集通过SR.ResourceManager消费经AssemblyResources.SharedResources暴露每个中性资源旁都有一个同名xlf目录内含.xlf格式的本地化字符串每种语言一个 xlf 文件资源的逻辑命名规则为Assembly Name.Neutral Resx File Name.resources在ResourceManager中体现为Assembly Name.Neutral Resx File Name不带结尾的.resources。例如Microsoft.Build程序集使用Microsoft.Build.Strings.resources资源文件为Strings.resx见 src/Build/Microsoft.Build.csproj其ResourceManager使用Microsoft.Build.Strings见 src/Build/Resources/AssemblyResources.cs。如何编辑资源与本地化构建做了什么编辑规则新增/删除/更新资源时只改中性 resx 文件xlf 文件会在本地化构建时自动更新。本地化构建的产出将 xlf 转换为本地化的 resx生成到$(IntermediaryOutputPath)并为每种语言生成附属程序集satellite assemblies。附属程序集即使在英文机器上也会被使用——这是为了测试确保英文构建与非英文构建行为一致。翻译贡献与 XSD IntelliSense 本地化更好的翻译贡献方式向 xlf 资源的target元素提交 PR不要夹带其他非本地化改动MSBuild 团队会通知本地化团队接手评审。XSD 本地化为 MSBuild 项目文件提供代码补全IntelliSense的 XML Schema 文件如Microsoft.Build.CommonTypes.xsd在 GitHub 仓库中是纯英文的其本地化在微软内部 VS 仓库中管理仓库中的 XSD 更新会通过 MSBuild→VS 仓库的插入insertion流程自动同步到 Visual Studio 的规范副本XSD 本地化问题可提交到本仓库由团队协调处理。组件地图MSBuild 的五大核心命名空间README 将仓库划分为五个核心组件均可从源码目录直接对应组件命名空间 / 入口源码位置职责MSBuildMicrosoft.Build.CommandLineMSBuild.exe入口src/MSBuild命令行入口负责参数解析并调用引擎Microsoft.BuildMicrosoft.Buildsrc/Build提供对构建引擎的编程式访问与控制BuildManager、Project等Microsoft.Build.FrameworkMicrosoft.Build.Frameworksrc/Framework定义任务task与记录器logger如何与引擎交互的接口类型Microsoft.Build.TasksMicrosoft.Build.Taskssrc/TasksMSBuild 随附全部任务如Csc、Copy、MSBuild等的实现Microsoft.Build.UtilitiesMicrosoft.Build.Utilitiessrc/Utilities用于编写自定义记录器与任务的辅助类框架组件Microsoft.Build.Framework还配套了专门的 wiki 页面documentation/wiki/Microsoft.Build.Framework.md详细说明任务、记录器与引擎之间的交互契约。此外src/BuildCheck是仓库中较新的构建检查BuildCheck实验模块属于引擎侧的分析能力不属于 README 定义的五大组件。单元测试从命令行与 Visual Studio 运行命令行运行单个/全部测试按 documentation/wiki/Building-Testing-and-Debugging-on-.Net-Core-MSBuild.md 的指引build.cmd # 先完成一次完整构建 cd test\YOURTEST.Tests # 进入包含测试 csproj 的测试目录 dotnet test --filter FullyQualifiedName~TESTNAME # 运行单个测试完整构建并运行全部单元测试可用.\build.cmd -testWindows.NET Framework 开发者指南 documentation/wiki/Building-Testing-and-Debugging-on-Full-Framework-MSBuild.md 同样推荐此命令。在 Unix 上则是./build.sh --test。仓库中的测试工程与源码模块一一对应例如src/Build.UnitTests引擎单元测试含Microsoft.Build.Engine.UnitTests.csprojsrc/Framework.UnitTests框架接口测试src/MSBuild.UnitTests命令行MSBuild.exe测试如XMake_Tests.cs、CommandLineParserTests.cssrc/Tasks.UnitTests内置任务测试src/Build.OM.UnitTests对象模型测试src/BuildCheck.UnitTestsBuildCheck 分析器测试在 Visual Studio 中运行测试build.cmd # 先完成一次完整构建 devenv MSBuild.slnx # 在 Developer Command Prompt for VS 2026 中打开随后打开Test → Windows → Test Explorer → Run All即可。注意Visual Studio 中必须勾选 “Use previews of the .NET SDK (requires restart)” 选项。测试的特殊前置条件与 CI 模拟符号链接测试部分测试会创建符号链接来测试相关功能。要让它们通过要么在机器上启用开发模式Development Mode要么以管理员权限运行这些测试。模拟 CI 完整流程运行build.cmd -pack -sign -publish -ci可复现 CI 作业——CI 会执行两轮构建第二轮使用第一轮的二进制再次构建整个仓库。虚拟化环境测试若在 Windows 上开发、但需要在其他平台运行/调试测试可借助 Visual Studio 的远程测试功能仓库已提供testenvironments.jsontestenvironments.json作为 WSL 与 .NET 7.0 Linux Docker 的初始配置。打开 Test Explorer 即可看到这些高级环境。注意 WSL 与 Docker 场景需要各自安装运行时第三方测试运行器可能不支持该功能应使用 Visual Studio 的 Test Explorer。调试 MSBuild从断点到日志的完整工具箱入口断点MSBUILDDEBUGONSTART环境变量在MSBuild.exe的main方法src/MSBuild/XMake.cs 的MSBuildApp其中DebuggerLaunchCheck()负责启动时检查该环境变量设置断点可用环境变量控制调试器行为值行为1为所有进程主 MSBuild 与 TaskHost 子进程启动调试器Debugger.Launch()2等待手动附加调试器所有进程控制台会打印 PID 并等待回车3仅为 MSBuild 主进程启动调试器跳过 TaskHost 子进程源码见 src/MSBuild/XMake.cs4Server 模式下在服务器进程中启动调试器Windows5Server 模式下等待手动附加暂停发生在连接之后、评估之前源码中DebuggerLaunchCheck()src/MSBuild/XMake.cs的实现印证了上述语义1/4服务器节点调用Debugger.Launch()3通过FrameworkDebugUtils.IsInTaskHostNode()跳过子进程2打印Waiting for debugger to attach (...PID ...). Press enter to continue...并Console.ReadLine()等待5服务器节点打印 PID 后循环Thread.Sleep(100)直到Debugger.IsAttached。TaskHost 侧的对应检查位于 src/MSBuildTaskHost/OutOfProcTaskHost.cs。调试 MSBuild Server服务器模式当启用 MSBuild Server 时可按如下方式调试服务器进程documentation/wiki/Building-Testing-and-Debugging-on-.Net-Core-MSBuild.md$env:MSBUILDUSESERVER 1 $env:MSBUILDDEBUGONSTART 5 dotnet msbuild .\project.proj之后附加到终端打印的服务器 PID 并恢复执行即可——与模式2不同无需按回车键因为客户端已经建立连接也不需要改动连接或握手逻辑。模式4/5不覆盖服务器启动与握手阶段的调试调试完毕后记得取消设置MSBUILDDEBUGONSTART。引擎入口断点MSBuildDebugBuildManagerOnStart要切入引擎的BuildManager.BeginBuildsrc/Build/BackEnd/BuildManager/BuildManager.cs设置环境变量MSBuildDebugBuildManagerOnStart值为1使用Debugger.Launch()值为2则等待调试器附加。这在通过 API而非可执行文件调用 MSBuild 的场景如 Visual Studio中尤其有用。还可通过MSBuildDebugProcessName设置进程名子串过滤触发断点的进程例如设为devenv就只在 Visual Studio 顶层进程下触发。调试日志MSBuildDebugEngine与二进制日志注入设置MSBuildDebugEngine1可让 MSBuild 输出所有可能的调试日志如调度器状态、节点通信并会在BuildManager.BeginBuild期间注入一个二进制日志binlog。这在 MSBuild 被其他应用经 API 调用、且这些应用过滤甚至抑制构建事件时极其有用——例如 Visual Studio 在常规构建中会重度过滤事件、在设计时构建design time builds中会抑制事件而MSBuildDebugEngine能让真实构建与设计时构建都产出完整二进制日志。日志默认保存在当前工作目录下的MSBuild_Logs目录可用MSBUILDDEBUGPATH覆盖默认位置同样可用MSBuildDebugProcessName过滤产生日志的进程。定点转储日志调度器状态设置MSBUILDDEBUGSCHEDULER1并用MSBUILDDEBUGPATH指定输出目录节点通信设置MSBUILDDEBUGCOMM1并用MSBUILDDEBUGPATH指定输出目录。用仓库二进制做真实构建与部署使用仓库二进制构建项目完成一次构建默认会生成 bootstrap 目录后可直接让仓库产物指向项目文件artifacts\bin\bootstrap\net472\MSBuild\Current\Bin\MSBuild.exe 你的项目文件用 Deploy-MSBuild 把本地构建注入 Visual Studioscripts/Deploy-MSBuild.ps1 脚本使用说明见 documentation/Deploy-MSBuild.md可把本地构建的 MSBuild 二进制覆盖到 Visual Studio 安装目录便于在 VS 内测试/调试本地改动。示例管理员 PowerShell按你的 VS 版本与安装路径调整目标目录# bootstrap 构建 .\build.cmd # 把 bootstrap 构建产物复制覆盖到 Visual Studio 中的 MSBuild 二进制 .\scripts\Deploy-MSBuild.ps1 -destination C:\Program Files\Microsoft Visual Studio\18\Enterprise\MSBuild\Current\Bin要点-configuration参数必须与传给build.cmd的配置一致默认Debug脚本默认会先备份相关 MSBuild 二进制再复制新二进制警告覆盖 Visual Studio 中的 MSBuild 可能破坏 Visual Studio进而导致无法再构建 MSBuild 来修复问题脚本默认生成的备份可能需要手动拷回。若构建与部署不在同一台机器可先把构建产物部署到空文件夹再手动备份并覆盖目标 VS 安装。打补丁 .NET (Core) SDK 时传入-runtime CoreLinux 上没有 shell 脚本需要安装 PowerShell 后执行pwsh scripts\Deploy-MSBuild.ps1。从 documentation/wiki/Bootstrap.md 所述机制开始构建会自动在 bootstrap 目录中生成一个已打补丁的 .NET SDK内含新 MSBuild 位并集成兼容的 .NET SDK 版本主要用于端到端测试、CI 运行以及需要将 MSBuild 改动与 .NET SDK 集成验证的开发场景——多数情况下可直接使用这个自动生成的 bootstrap SDK而无需手动打补丁现有 SDK。贡献指南速览在向仓库提交 PR 之前请先阅读以下文档documentation/wiki/Contributing-Code.md贡献指南明确仓库接受哪些类型的 PR开发者指南documentation/wiki/Building-Testing-and-Debugging-on-.Net-Core-MSBuild.md.NET Core与 documentation/wiki/Building-Testing-and-Debugging-on-Full-Framework-MSBuild.md.NET Frameworkdocumentation/wiki/Labels.md仓库 issue/PR 标签说明。此外仓库采用 MIT 许可证LICENSE可自由使用与再分发。总结本文以 README 为主线串联起仓库的构建Windows/Unix 两阶段引导构建、本地化resx xlf 与附属程序集、组件地图五大命名空间、测试命令行与 Test Explorer与调试MSBUILDDEBUGONSTART、MSBuildDebugEngine、Server 调试模式全流程。对想深入 MSBuild 源码的开发者而言推荐从三处入口继续探索src/MSBuild/XMake.cs命令行入口与调试开关、src/Build/BackEnd/BuildManager/BuildManager.cs引擎核心以及 eng/build.ps1构建编排与 bootstrap 逻辑并配合 documentation/Changelog.md 了解各版本的演进脉络。赞分享构建工具开发工具CLI【免费下载链接】msbuildThe Microsoft Build Engine (MSBuild) is the build platform for .NET and Visual Studio.项目地址https://gitcode.com/gh_mirrors/ms/msbuild点击查看免费下载相关推荐ASP.NET Core 仓库源码构建完全指南从 clone、restore 到本地构建与测试ASP.NET Core 仓库源码构建完全指南从 clone、restore 到本地构建与测试 本文基于 ASP.NET Core 官方仓库文档 BuildF后端Web框架MSBuild完全指南从零开始掌握.NET构建引擎MSBuild完全指南从零开始掌握.NET构建引擎 MSBuild是微软.NET生态系统中功能强大的构建引擎专门用于构建和管理.NET项目。无论你是.NET构建工具开发工具CLIAngular CLI 源码仓库开发者指南从本地构建、调试到测试的完整工作流Angular CLI 源码仓库开发者指南从本地构建、调试到测试的完整工作流 本篇指南围绕当前开源仓库angular cli即 Angular CLI 与CLI开发工具前端构建构建工具代码生成前端上一篇EOSIO v2.1.0-rc3 发布说明解读安全加固、稳定性修复与 2.1 版本系列全景下一篇如何使用PHPExcel实现高效数据透视表功能完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考