切换用户执行dotnet restore无法找到指定版本Nuget包如何解决
问题诱因
- NuGet配置分层差异:.NET的NuGet配置分为系统级、用户级、项目级三个层级,不同用户的用户级配置相互独立。默认用户的用户级
NuGet.Config中已经配置了私有源MyCompanyFeed的正确访问地址、拉取正式版包的权限凭证,而gitlab-runner用户的用户级配置要么缺少对应源的配置,要么凭证权限不足,仅能拉取预览版包,无法看到1.4.4正式版本。 - 本地缓存命中差异:默认用户此前已经成功执行过
dotnet restore,1.4.4版本的包已经缓存到当前用户的NuGet本地缓存目录,执行命令时无需请求远端源直接命中缓存,因此执行成功。而gitlab-runner用户的本地缓存无对应版本包,必须请求远端源拉取才会触发找不到包的报错。 - 清理缓存命令错误:你此前执行的
dotnet nuget locals all -l中-l参数的作用是列出所有缓存目录,并非清理缓存,因此缓存问题并没有得到实际处理。
修复方案
- 首先对比两个用户的NuGet源配置差异,确认私有源配置一致:
分别执行以下命令,对比输出的MyCompanyFeed地址、启用状态是否相同:
同时检查两个用户的# 默认用户执行 dotnet nuget list source # gitlab-runner用户执行 runuser gitlab-runner -c 'dotnet nuget list source'~/.nuget/NuGet/NuGet.Config文件,确认gitlab-runner用户的配置中存在MyCompanyFeed对应的<packageSourceCredentials>凭证配置,凭证的访问权限包含正式版包拉取权限。 - 执行正确的缓存清理命令后重试:
runuser gitlab-runner -c 'dotnet nuget locals all --clear' runuser gitlab-runner -c 'dotnet restore' - 推荐使用项目级NuGet配置避免用户配置差异:
在项目根目录存放NuGet.Config文件,统一配置所有需要的源信息,敏感凭证不要直接提交到代码库,可通过CI环境变量注入(比如GitLab CI中配置NUGET_AUTH_TOKEN变量,dotnet会自动识别并填充到私有源的凭证配置中),消除不同用户的配置差异问题。 - 确认私有源权限配置:
如果你们的私有NuGet服务对预览版、正式版做了权限隔离,需要确认gitlab-runner使用的服务账号是否有1.4.4正式版包的拉取权限。
内容的提问来源于stack exchange,提问作者pwas
相关产品推荐
相关产品推荐

