Azure DevOps中NuGet还原错误从非指定源搜索包的问题
问题描述
我有一个.NET解决方案,需要从三个源获取NuGet包:Nuget.org、自有组织源、另一个源。配置的nuget.config文件如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> <add key="MyOrga" value="..." /> <add key="TheOtherFeed" value="..." /> </packageSources> </configuration>
项目中引用了位于MyOrga源的MyPackage,以及位于TheOtherFeed源的MyOtherPackage。在Azure DevOps管道的Nuget Restore任务中,任务成功识别到nuget.config及三个包源,但报错:
##[error]The nuget command failed with exit code(1) and error(NU1301: Failed to retrieve information about 'MyPackage' from remote source '<TheOtherFeed>/MyPackage/index.json'.
明明存在正确的包源,却仅尝试从错误源获取包,请问哪里配置出错了?
问题原因及解决办法
出现这个问题的核心原因是NuGet 默认会按顺序遍历所有配置的包源查找包,但如果某个包源的权限配置有问题(比如该源要求认证,但管道中未提供对应凭据),或者包源本身返回了错误的包存在状态,会导致NuGet跳过后续源的查找,或者是因为你没有为特定包指定绑定的源,导致NuGet在遇到某个源的访问问题时提前终止。
你可以通过以下几种方式解决:
1. 为特定包绑定专属源(推荐)
在nuget.config中添加packageSourceMapping节点,明确指定每个包对应的源,这样NuGet只会去对应的源查找指定包,不会遍历其他源:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> <add key="MyOrga" value="..." /> <add key="TheOtherFeed" value="..." /> </packageSources> <!-- 添加包源映射规则 --> <packageSourceMapping> <packageSource key="MyOrga"> <package pattern="MyPackage" /> </packageSource> <packageSource key="TheOtherFeed"> <package pattern="MyOtherPackage" /> </packageSource> <!-- 将其余所有公共包映射到nuget.org --> <packageSource key="nuget.org"> <package pattern="*" /> </packageSource> </packageSourceMapping> </configuration>
这种方式能精准控制每个包的查找源,从根源上避免跨源查找的问题。
2. 检查Azure DevOps管道的源凭据配置
确认TheOtherFeed源在Azure DevOps管道中是否配置了正确的凭据:如果该源需要认证,但管道未提供对应权限,NuGet访问它时会出错,可能导致查找流程异常终止。你可以在NuGet Restore任务中添加对应的服务连接,确保每个私有源都能被正常访问。
3. 调整包源顺序
如果不想使用源映射,可以尝试调整packageSources中的源顺序,把MyOrga放在TheOtherFeed前面,这样NuGet会优先去正确的源查找MyPackage,找到后就不会再去其他源尝试:
<packageSources> <clear /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> <add key="MyOrga" value="..." /> <!-- 将TheOtherFeed调整到MyOrga之后 --> <add key="TheOtherFeed" value="..." /> </packageSources>
不过这种方式不如源映射可靠,若前面的源访问失败,NuGet仍会去后续源尝试查找。
内容的提问来源于stack exchange,提问作者krimog

