构建服务器上Microsoft NuGet包还原耗时过长问题求助
离线构建服务器Microsoft NuGet包还原耗时过长问题分析与解决
核心现象
- 离线环境下的构建服务器还原Microsoft官方NuGet包时,「添加」步骤耗时极长(例如
Microsoft.Extensions.Configuration.9.0.0耗时3分钟),但本地开发包仅需数毫秒即可完成 - 原本1分钟的NuGet还原流程被拖至近20分钟,临时联网后问题暂时消失,但1天至1周后会再次出现
- 已排除磁盘空间、服务器负载问题,启用NuGet详细输出(
-vvv)也未获取到额外异常信息
原因推测
结合离线环境特性,核心原因大概率是Microsoft官方NuGet包的签名证书触发了在线校验/吊销检查:
- Microsoft发布的NuGet包通常带有数字签名,默认情况下NuGet会尝试在线验证证书有效性或检查证书是否被吊销
- 离线环境下这些在线请求无法完成,会触发超时等待(通常为3分钟左右的默认超时时间),导致包添加步骤停滞
- 临时联网时NuGet会缓存证书校验结果,缓存过期后超时问题再次出现
解决思路
1. 直接禁用NuGet包签名验证
这是最直接的解决方案,适合无需强制验证包签名的场景:
- 命令行还原时添加参数:
nuget restore -DisablePackageSignatureValidation - 或在构建服务器的
NuGet.Config文件中全局配置:<configuration> <config> <add key="disablePackageSignatureValidation" value="true" /> </config> </configuration>
2. 配置本地证书吊销列表(CRL)缓存
如果必须保留包签名验证,可以提前下载Microsoft证书的CRL文件到本地,避免在线请求:
- 找到对应签名证书的CRL地址(可通过查看包签名详情获取)
- 下载CRL文件到构建服务器本地路径
- 通过Windows组策略或本地证书管理器,配置服务器使用本地CRL文件进行校验
3. 确保NuGet本地缓存完整性
离线环境下,缓存损坏也可能导致异常耗时:
- 清理NuGet本地缓存:
nuget locals all -clear - 从本地NuGet源重新推送并还原所有需要的包,确保缓存中的包文件完整无损坏
4. 搭建本地NuGet源
彻底隔离外部依赖,避免任何隐式在线请求:
- 部署本地NuGet服务器(如NuGet.Server、BaGet)
- 将所有需要的Microsoft包提前下载并上传至本地源
- 修改构建服务器的
NuGet.Config,仅配置本地源作为包来源
内容的提问来源于stack exchange,提问作者AMD
相关产品推荐
相关产品推荐

