资讯详情

资讯详情

ASP.NET Core 仓库构建错误排障手册:BUILD 错误码、SDK 与环境问题的完整解决方案

ASP.NET Core 仓库构建错误排障手册BUILD 错误码、SDK 与环境问题的完整解决方案【免费下载链接】aspnetcoreASP.NET Core is a cross-platform .NET framework for building modern cloud-based web applications on Windows, Mac, or Linux.项目地址: https://gitcode.com/GitHub_Trending/as/aspnetcore在 dotnet/aspnetcore 这类超大型开源仓库中一次成功的构建远比打开 Visual Studio 按 F5复杂得多它依赖统一生成的构建产物、共享输出目录、服务化servicing引用解析规则以及本地自举的 .NET SDK。本文以仓库 docs/BuildErrors.md 为骨架系统梳理从源码编译到测试运行过程中最常见的构建失败及其修复手段——覆盖 BUILD001/BUILD002/BUILD003 专属错误码、CS0006 元数据缺失、MSB 系列 MSBuild 错误、NuGet 源不可用、ANCM/IIS Express 运行冲突等十类典型场景。读完本文你将能独立诊断并解决在本地克隆、编译与调试 ASP.NET Core 源码时遇到的绝大多数构建问题。一、排障前的通用准备陈旧构建产物的清理三板斧文档开篇给出了一个重要原则很多构建问题并非代码错误而是旧构建产物与新提交互相冲突。仓库官方建议在切换提交checkout之间执行彻底清理git clean -xddff其中-x表示同时删除被.gitignore忽略的文件-d递归删除未跟踪目录-f强制执行两个f用于强制删除嵌套的已忽略目录。如果该命令因文件被占用而失败通常意味着有dotnet或.NET Host进程仍在运行、锁住了文件应先停掉这些进程再重试。该建议的根源在于本仓库独特的目录约定——所有项目共享统一的输出目录artifacts/bin/$(ProjectName)与artifacts/obj/$(ProjectName)本地构建时 SDK 与工具链则自举到仓库根目录的.dotnet、.tools两个隐藏目录见根目录的 restore.sh、restore.cmd 与 global.json。一旦这些自举工具或artifacts缓存与当前分支要求不一致各类幽灵错误就会接踵而至后文多个章节都会回到这一根因。二、仓库专属错误码BUILD001 / BUILD002 / BUILD003ASP.NET Core 仓库并不直接使用编译器的错误码来约束哪些引用可以变更而是定义了一套专属的 BUILD 错误码。理解它们之前需要先了解仓库独特的引用解析机制大多数项目文件使用Reference而非ProjectReference或PackageReference构建系统会依据服务化与版本更新规则把Reference解析为正确的引用类型与版本。这套机制的具体实现与配套文件详见 docs/ReferenceResolution.md实现代码位于 eng/targets/ResolveReferences.targets其核心约束有三条外部依赖的版本应保持一致且易于发现新版本包的依赖版本不得低于此前发布版本服务化发布servicing releases不得在既有包中增删依赖。正是这三条规则催生了下面的错误码。2.1 warning BUILD001包引用的移除可能构成破坏性变更报错形态大致为warning BUILD001: Reference to … was removed since the last stable release of this package. …该警告表示某个程序集或包在上一稳定版本中曾被引用而当前改动将其移除这可能是一次破坏性变更breaking change。它属于可抑制警告具体的抑制方式请参阅 docs/ReferenceResolution.md 中对引用规则的说明——其文档化流程强调新增程序集/包依赖时通过 eng/Dependencies.props 与 eng/Versions.props 登记新增项目则运行eng/scripts/GenerateProjectList.ps1重新生成项目清单从而让构建系统保持对引用的精确追踪。2.2 error BUILD002服务化构建中引用集合发生变化error BUILD002: Package references changed since the last release…BUILD002 与 BUILD001 类似但它是错误error而非警告且不可抑制。文档明确指出该错误只会在服务化servicing构建分支中出现——服务化分支本就不应改动程序集或包之间的引用关系一旦出现就意味着违反servicing 不增删依赖的硬性约束。2.3 error BUILD003存在重名的项目文件error BUILD003: Multiple project files named Banana.csproj exist. Project files should have a unique name to avoid conflicts in build output.由于仓库统一使用artifacts/bin/$(ProjectName)与artifacts/obj/$(ProjectName)作为共享输出目录两个不同目录下若出现同名.csproj构建产物就会相互覆盖、产生不可预期的冲突。因此仓库强制要求每个项目文件必须唯一命名通常以程序集名命名 .csproj参见 docs/ReferenceResolution.md 的命名建议。从源码可以确认该规则的落地位置校验脚本 eng/scripts/CodeCheck.ps1约第 74–91 行会递归扫描src/*.*proj排除submodules、node_modules、bin、模板content目录与ref目录用HashSet检测重复的项目文件名并输出 BUILD003。这也解释了为什么新增项目文件时命名前先全局搜索确认无重名是最低成本的做法。同样的脚本还承担多项一致性检查.slnx/.slnf是否同步、eng/Dependencies.props与 Dependabot 发现项目是否一致、生成代码是否已提交等。三、error CS0006Metadata file 找不到——解决方案筛选器漏掉了项目打开.sln/.slnf解决方案筛选器构建时可能看到类似错误Error CS0006 Metadata file …\AspNetCore\artifacts\bin\Microsoft.AspNetCore.Metadata\Debug\netstandard2.0\Microsoft.AspNetCore.Metadata.dll could not be found根因你当前使用的解决方案筛选器solution filter没有包含产出该 DLL 的项目。文档指出这大多发生在仓库新增了项目但 .sln/.slnf 未同步更新之后在少数情况下.slnf 被刻意设计为只包含一部分项目如各功能目录下的Mvc.slnf、Kestrel相关的 slnf漏掉依赖项目正是其预期行为。修复方式有三条按推荐顺序排列改用命令行完整构建多数情况下直接运行仓库根目录的build.cmdWindows即可解决——它构建全量项目天然补齐缺失的 DLL。项目完全不在 .sln 中执行dotnet sln add path/to/project.csproj将其加入解决方案或在 Visual Studio 中右键解决方案/文件夹选择添加Add→ 现有项目Existing Project。项目在 .sln 中但不在 .slnf 中更新筛选器以包含缺失项目。可在 Visual Studio 中右键该项目选择加载其直接依赖项后保存也可以手工编辑 .slnf 文件——文档特别说明它是一个相当简单的 JSON 格式其中solution.projects数组列出相对项目路径直接补充缺失条目即可。仓库当前的顶层解决方案为 AspNetCore.slnx各功能模块则配有轻量的.slnf例如 src/Mvc/Mvc.slnf修改后建议顺手运行 eng/scripts/CodeCheck.ps1 做一致性校验该脚本会校验每个.slnf引用的项目都存在于主解决方案中。四、error MSB4019GenerateFiles 生成物缺失——首次构建顺序错误error MSB4019: The imported project …\artifacts\bin\GenerateFiles\Directory.Build.props was not found这条错误说明你跳过了仓库的生成步骤直接用dotnet命令构建了某个项目。本仓库的构建并不只是编译GenerateFiles等工具位于 eng/tools/GenerateFiles会在构建早期生成若干.props/.targets与项目清单这些文件被后续所有项目 Import。若从未执行过仓库自带的构建脚本这些生成物就不存在。正确做法是在用裸dotnet命令构建之前至少先执行一次完整的空跑构建以生成所需文件.\build.cmd -noBuildNative -noBuildManaged或Linux/macOS./build.sh --no-build-managed-noBuildNative/--no-build-managed的意义是跳过原生C代码与托管C#/F#代码的编译阶段只执行工具链安装与文件生成因此耗时相对较短适合作为后续手工dotnet build的前置步骤。也可以直接使用 restore.sh/restore.cmd 完成工具链自举。五、error MSB4236无法定位 .NET Core SDK执行restore.cmd或build.cmd时可能出现error : Unable to locate the .NET Core SDK. Check that it is installed and that the version specified in global.json (if any) matches the installed version. error MSB4236: The SDK Microsoft.NET.Sdk specified could not be found.根因仓库通过根目录 global.json 固定了 SDK 版本典型地指向最新的 preview 版本本机的 SDK 与该版本不匹配。文档给出最常见的场景与解法在 Visual Studio 2019 中未勾选使用 .NET Core SDK 预览版。请打开工具Tools 选项Options 环境Environment 预览功能Preview Features勾选Use previews of the .NET Core SDK后重启 VS。需要提醒的是即便在较新环境中若你手动安装了与 global.json 不符的 SDK或尚未运行 restore.sh 让脚本下载仓库自举的 SDK 到.dotnet目录同样会触发此错误——restore系列脚本的设计目的正是把版本匹配的 SDK 安装到仓库本地。六、C/原生组件引发的两则错误仓库中包含需要 C 工具链的原生项目典型代表是 IIS 相关的 src/Servers/IIS 目录下的 AspNetCoreModuleV2 与 IISLib 等.vcxproj。当开发环境缺少正确的 C 安装时restore.cmd/build.cmd会报出以下两类错误。6.1 error MSB4019Microsoft.Cpp.Default.props 未找到报错形如C:\git\aspnetcore\src\Servers\IIS\build\Build.Common.Settings(12,3): error MSB4019: The imported project C:\git\aspnetcore\.tools\msbuild\17.1.0\tools\MSBuild\Microsoft\VC\v170\Microsoft.Cpp.Default.props was not found. Confirm that the expression in the Import declaration C:\git\aspnetcore\.tools\msbuild\17.1.0\tools\MSBuild\Microsoft\VC\v170\\Microsoft.Cpp.Default.props is correct, and that the file exists on disk. [C:\git\aspnetcore\src\Servers\IIS\AspNetCoreModuleV2\AspNetCore\AspNetCore.vcxproj] C:\git\aspnetcore\src\Servers\IIS\build\Build.Common.Settings(12,3): error MSB4019: The imported project …\Microsoft.Cpp.Default.props was not found. … [C:\git\aspnetcore\src\Servers\IIS\AspNetCoreModuleV2\IISLib\IISLib.vcxproj]注意错误路径指向.tools\msbuild\…\Microsoft\VC\v170\Microsoft.Cpp.Default.props——即仓库自举的 MSBuild 期望从本机 Visual Studio 的 C 工具集VC v170 对应 VS2022 工具集中导入默认属性文件而本机并未安装对应的 C 工作负载。修复按 docs/BuildFromSource.md 的指引确认并安装 Visual Studio 的 C 组件特别是文档强调的运行 eng/scripts/InstallVisualStudio.ps1 一节该脚本可自动安装仓库要求的 VS 组件清单。注意原文档中此错误示例出现在 Windows 环境在 Linux 上对应场景通常表现为依赖cmake、clang等原生工具链缺失可通过 eng/common/native 下的install-dependencies.sh等脚本补装。6.2 error MSB4018InstallDotNetCore 任务意外失败另一种与原生环境相关的报错C:\.nuget\packages\microsoft.dotnet.arcade.sdk\8.0.0-beta.23364.2\tools\InstallDotNetCore.targets(15,5): error MSB4018: The InstallDotNetCore task failed unexpectedly. [C:\.nuget\packages\microsoft.dotnet.arcade.sdk\8.0.0-beta.23364.2\tools\Tools.proj] error MSB4018: System.MissingMethodException: Method not found: System.Text.Json.JsonDocument System.Text.Json.JsonDocument.Parse(System.ReadOnlyMemory1Byte, System.Text.Json.JsonDocumentOptions).这段错误栈非常有诊断价值Arcade SDK 的InstallDotNetCore任务在调用System.Text.Json.JsonDocument.Parse(ReadOnlyMemorybyte, …)时抛出MissingMethodException意味着实际加载的 System.Text.Json 运行时版本比任务编译所依赖的版本更旧——即本机存在旧版 .NETCore运行时/SDK干扰了仓库自举的 SDK 执行安装任务。这与后文旧克隆恢复错误一节高度相关。文档给出的修复动作同样是确认已按 docs/BuildFromSource.md 安装了 Visual Studio 的 C 组件即运行 eng/scripts/InstallVisualStudio.ps1。结合错误栈可以推断在环境已正确配置后若仍出现此类MissingMethodException还应清理本机残留的旧版 SDK/运行时可参照第八节删除.dotnet、.tools重新自举确保 Arcade 任务加载到与global.json匹配的新版运行时。七、HTTP Error 500.33ANCM Request Handler Load Failure运行项目而非编译时会出现另一类构建/调试错误。仓库明确说明ASP.NET Core ModuleANCM即 IIS 的托管模块在本仓库中不受支持——当你在仓库中开发宿主Hosting相关代码时经 IIS Express 运行必然触发 HTTP Error 500.33。因此文档给出的铁律是使用 startvs.cmd 打开解决方案后必须选择 Kestrel 作为 Web 宿主即启动按钮下拉框中选择项目名本身而不是 IIS Express。例如运行 MvcSandbox 项目的完整流程为.\startvs.cmd .\src\Mvc\Mvc.sln启动后在 Visual Studio 工具栏的运行下拉菜单中选择MvcSandbox而非 IIS Express。下图展示了该下拉菜单中的两种宿主选项从 startvs.cmd 的源码可以理解其中的原理该脚本会把DOTNET_ROOT指向仓库根目录下自举的.dotnetSET DOTNET_ROOT%~dp0.dotnet并将其置于PATH最前确保 Visual Studio 使用仓库本地 SDK 打开解决方案同时脚本要求必须先运行restore.cmd完成 SDK 安装。这也解释了为何本文档要求通过startvs.cmd而非双击 .sln 打开——只有经由它启动VS 才会使用与仓库匹配的 SDK 环境从而能正确承载 Kestrel 宿主进程。八、error: Unable to load the service index for …服务化 Tag 还原失败当尝试还原服务化标签如v3.1.7对应的提交时NuGet.config中可能包含外部无法访问的内部源典型报错如下…\aspnetcore.dotnet\sdk\3.1.103\NuGet.targets(123,5): error : Unable to load the service index for source https://pkgs.dev.azure.com/dnceng/_packaging/darc-int-dotnet-extensions-784b0ffa/nuget/v3/index.json. […\Temp\1gsd3rdo.srb\restore.csproj] [….nuget\packages\microsoft.dotnet.arcade.sdk\1.0.0-beta.20213.4\tools\Tools.proj]根因仓库根目录 NuGet.config 中的darc-int-…系列内部 feed 仅用于 dotnet 团队内部构建在标签被创建后、外部开发者还原时这些源已不再需要且由于是内部 Azure DevOps 源外部环境无法访问。修复编辑根目录 NuGet.config删除其中所有darc-int-…条目后重新执行还原即可。若还原旧标签提交时遇到其他源相关错误也可核对 .NET SDK 是否为该分支global.json所要求的版本仓库自举的 SDK 位于.dotnet目录。九、Error: Generated code is not up to date in eng/ProjectReferences.props当移动或新增了项目但未同步更新构建清单时代码检查会报告生成代码未更新。文档指出发生项目增删/移动后需要更新 eng/Build.props 中的两个DotNetProjects Include列表。这一错误的实际触发点是 eng/scripts/CodeCheck.ps1 中的生成代码检查逻辑脚本会重新运行 eng/scripts/GenerateProjectList.ps1 重生成项目清单然后执行git diff比对工作区是否有待提交变更若有变化排除 Blazor JS 产物等白名单文件即以Generated code is not up to date in …的形式报错并提示参照 docs/ReferenceResolution.md 重新生成引用程序集或项目清单。因此新增项目时的标准动作是创建 .csproj → 运行eng/scripts/GenerateProjectList.ps1或build.cmd /t:GenerateProjectList→ 把新项目加入 AspNetCore.slnx 及相关的*.slnf。十、Warning: Requested Microsoft.AspNetCore.App v… does not exist该警告出现在构建项目或执行测试时这些项目/测试需要刚构建完成的 Microsoft.AspNetCore.App 共享框架而它尚未被安装到$(DOTNET_ROOT)目录中。执行下面的命令即可把共享框架生成到 SDK 目录.\build.cmd -projects src\Framework\App.Runtime\src\Microsoft.AspNetCore.App.Runtime.csproj或./build.sh --projects $PWD/src/Framework/App.Runtime/src/Microsoft.AspNetCore.App.Runtime.csproj需要说明的是在当前仓库中该入口文件的实际名称为 src/Framework/App.Runtime/src/Microsoft.AspNetCore.App.Runtime.sfxprojsfxproj表示共享框架项目文档中的.csproj写法来自较早分支。本仓库所有随框架分发的组件都会被聚合进该 App.Runtime 共享框架相关的引用清单可参考 eng/ProjectReferences.props 与 src/Framework/App.Runtime 目录结构。如果你在本仓库修改了框架内的代码例如 src/Http 或 src/Mvc 下被框架聚合的项目要让外部测试项目看得到改动就需要重新构建 App.Runtime 以刷新$(DOTNET_ROOT)下的共享框架。十一、还原旧克隆时的错误清理 .dotnet 与 .tools文档给出的最后一个通用场景非常有代表性如果你在很久之前克隆了仓库现在运行restore.cmd或restore.sh时出现构建错误尝试删除仓库根目录下的.dotnet与.tools目录后重新还原。这通常能解决旧版本 .NET SDK 与最新分支要求不兼容的问题。该方案与本文第一节的建议同源仓库使用 restore.sh/restore.cmd 把与当前 global.json 匹配的 SDK/工具链自举到本地.dotnet/.tools当这些目录中残留的是旧克隆时代的版本时就会与最新构建脚本、Arcade SDK 乃至原生 MSBuild 组件发生各种灵异冲突——删除后重新自举即可强制刷新到正确版本。同样若出现文件被占用导致清理失败请先结束正在运行的dotnet/.NET Host进程。总结按症状定位先清理再深挖回顾全文aspnetcore 仓库的构建错误大体可归为四类诊断时可以按此顺序排查类别典型症状首选处置产物/工具链过期MSB4018InstallDotNetCore、旧克隆还原失败、MSB4236git clean -xddff 删除.dotnet/.tools后重新restore构建顺序/清单缺失MSB4019GenerateFiles、CS0006、生成代码未同步先跑build.cmd -noBuildNative -noBuildManaged再同步 .sln/.slnf/项目清单引用与依赖违规BUILD001/BUILD002/BUILD003、NuGet 源不可用遵循 docs/ReferenceResolution.md 引用规则删除内部 feed运行环境配置HTTP 500.33、C 原生组件缺失用startvs.cmd Kestrel 运行按 docs/BuildFromSource.md 补装组件在投入精力逐行排查前务必先执行文档反复强调的清理动作——在这样一个共享输出目录 本地自举 SDK 的仓库里产物过期是远比代码错误更常见的失败根源。若你的场景仍未覆盖可进一步阅读 docs/BuildFromSource.md环境准备与完整构建指引与 docs/ReferenceResolution.md引用解析机制它们与本手册共同构成了仓库贡献者上手构建的完整知识闭环。【免费下载链接】aspnetcoreASP.NET Core is a cross-platform .NET framework for building modern cloud-based web applications on Windows, Mac, or Linux.项目地址: https://gitcode.com/GitHub_Trending/as/aspnetcore创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →