迁移至.NET6时TC构建机找不到Microsoft.NETCore.App.Host.win-x64
问题背景
- 计划将所属代码仓库从.NET5迁移至.NET6,因涉及项目数量较多,拟分多阶段推进,迁移过程中会存在部分项目仍面向.NET5、其余项目已升级至.NET6的中间状态。
- 仓库使用私有NuGet源,已禁用官方
nuget.org源。 - 迁移第一步更新了
global.json配置文件,内容如下:
{ "sdk": { "version": "6.0.201", "rollForward": "disable" } }
该配置此前指定的SDK版本为5.0.201。通过dotnet --list-sdks命令确认本地环境已安装6.0.201版本SDK,输出如下:
╰─ dotnet --list-sdks 5.0.102 [C:\Program Files\dotnet\sdk] 5.0.201 [C:\Program Files\dotnet\sdk] 6.0.201 [C:\Program Files\dotnet\sdk] 6.0.300 [C:\Program Files\dotnet\sdk]
- 随后选取仓库内部分项目,将目标框架配置从:
<TargetFramework>net5.0-windows</TargetFramework>
修改为:
<TargetFramework>net6.0-windows</TargetFramework>
修改完成后本地编译完全正常,无任何报错或警告。
- 但TeamCity(TC)构建机无法完成该仓库构建,所有未完成迁移的
net5.0项目均出现如下报错:
NU1101: Unable to find package Microsoft.NETCore.App.Host.win-x64. No packages exist with this id in source(s): Microsoft Visual Studio Offline Packages, MyLocalNuGetCache
- 本地环境排查时未找到
Microsoft.NETCore.App.Host.win-x64包,但本地构建可正常运行。同时在TC构建机上执行dotnet --list-sdks命令,确认已安装6.0.201版本SDK,输出如下:
╰─ dotnet --list-sdks 5.0.102 [C:\Program Files\dotnet\sdk] 5.0.201 [C:\Program Files\dotnet\sdk] 6.0.201 [C:\Program Files\dotnet\sdk]
咨询问题
Microsoft.NETCore.App.Host.win-x64包的作用是什么,如何在本地环境中定位该包?- 排查TC构建机上仓库构建失败问题的最优切入点是什么?
问题解答
Microsoft.NETCore.App.Host.win-x64包的作用与本地定位方法
这个包是.NET Windows x64平台的原生宿主组件,核心作用是提供.NET应用启动所需的原生引导二进制,负责在进程启动时加载CLR运行时,属于.NET SDK/运行时自带的内置组件,不会作为独立NuGet包发布到公共源供用户主动拉取。
本地不需要在NuGet缓存中查找该包,直接进入SDK安装目录即可定位:对应版本的组件存放在C:\Program Files\dotnet\sdk\<SDK版本号>\RuntimePacks\Microsoft.NETCore.App.Host.win-x64路径下。本地构建能正常运行,就是因为NuGet还原时会优先扫描SDK内置的运行时包,不会主动去配置的NuGet源查找该组件。
TC构建机构建失败的排查切入点
报错的核心原因是NuGet还原流程没有扫描到本地SDK内置的运行时包,才会转向配置的私有源查找并触发NU1101错误,按优先级从高到低排查效率最高:
- 第一优先级检查构建还原参数:查看TC构建步骤中的dotnet还原命令是否误加了
--no-restore-runtime-packs开关,或者仓库内的NuGet.Config、项目文件中是否配置了RestoreRuntimePackages=false属性,这两个配置会直接禁用本地SDK运行时包的扫描逻辑,强制NuGet从远程源拉取运行时组件。 - 第二优先级检查TC服务运行权限:如果TC构建服务的运行账号没有
C:\Program Files\dotnet目录的读取权限,NuGet就无法遍历目录下的内置运行时包,直接触发找不到包的错误。 - 第三优先级校验TC机上.NET 5.0 SDK的安装完整性:使用6.0 SDK编译net5.0项目时,需要依赖本地已安装的5.0版本运行时组件。虽然TC机显示已安装5.0.201版本SDK,但如果使用了精简安装包、或者安装过程中RuntimePacks目录下的文件被安全软件拦截删除,就会出现组件缺失,直接对比本地开发机和TC机的
C:\Program Files\dotnet\sdk\5.0.201\RuntimePacks目录文件即可确认完整性。 - 最后可尝试清理NuGet缓存:如果之前构建留下了损坏的缓存文件,也可能导致本地包识别失败,在还原步骤前执行
dotnet nuget locals all --clear清理全量缓存后再重试即可。
内容的提问来源于stack exchange,提问作者LA.27
相关产品推荐
相关产品推荐

