Azure Devops 上的 Nuget 还原失败并显示消息 "unable to load the service index for source"

Nuget restore fails on Azure Devops with message "unable to load the service index for source"

我有一个 .NET 解决方案的构建 运行 在私人代理中。该解决方案同时包含 .NET Core 2.1 和 .NET Standard 2.0 项目。

安装的一些 nuget 包如下:

尝试恢复 nuget 包时构建失败并出现以下错误:

"F:\Agent01\w1\s\xxxxxxx.sln" (Restore target) (1) -> (Restore target) -> C:\Program Files\dotnet\sdk.1.500\NuGet.targets(114,5): error : Unable to load the service index for source https://xxxxxxxxxx.pkgs.visualstudio.com/_packaging/xxxxxxxxxx/nuget/v3/index.json. C:\Program Files\dotnet\sdk.1.500\NuGet.targets(114,5): error : Response status code does not indicate success: 401 (Unauthorized).

构建任务如下:

这是构建代理中 %appdata%\NuGet\nuget.config 文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    <add key="MyFeed" value="https://xxxxxxxxxx.pkgs.visualstudio.com/_packaging/xxxxxxxxxx/nuget/v3/index.json" />
  </packageSources>
  <packageSourceCredentials>
    <MyFeed>
      <add key="Username" value="LocalBuildAgent" />
      <add key="ClearTextPassword" value="xxxxxxxxxxx" />
    </MyFeed>
  </packageSourceCredentials>
</configuration>

我已经检查了几个类似的问题,但到目前为止我还没有找到解决我的问题的方法。

一些注意事项:

我错过了什么?如何解决这个问题?为什么我不能使用 dotnet restore 命令恢复软件包?

更新:

使用 old Nuget Restore 任务时,包恢复没有错误,如下所示:

更新 2:

我能够使用 .NET Core 任务 v1 恢复包:

或者使用带有参数 --force:

的 v2 任务

我找到了解决方案 - 将以下包源添加到 %appdata%\NuGet\nuget.config:

<add key="Microsoft Visual Studio Offline Packages" value="C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\" />

完整的文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="Microsoft Visual Studio Offline Packages" value="C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\" />
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    <add key="MyFeed" value="https://xxxxxxxxxx.pkgs.visualstudio.com/_packaging/xxxxxxxxxx/nuget/v3/index.json" />
  </packageSources>
  <packageSourceCredentials>
    <MyFeed>
      <add key="Username" value="LocalBuildAgent" />
      <add key="ClearTextPassword" value="xxxxxxxxxxx" />
    </MyFeed>
  </packageSourceCredentials>
</configuration>

另外,检查 Regression in .NET SDK 500: 'dotnet tool install' fails with 401 (Unauthorized) when there is a private feed in NuGet.config #7524。此问题似乎是由 .NET SDK 2.1.500 引起的。

另一种解决方法是卸载该版本:

The issue is not present in .NET Core SDK 2.1.400, e.g. it goes away when .NET Core SDK 2.1.500 is uninstalled, and reappears when SDK 2.1.500 is installed again.

我必须将 nuget 安装程序更改为 4.8.1,以便在将 VSTS url 切换到新的 Azure Devops url.

后使其正常工作

使用最新的 "Use .NET Core sdk 2.1.504" 任务对我有用。 似乎有一些有问题的 .NET Core sdk 2.1.5xx 版本。

我遇到了同样的问题,但原因不同——没有授予 PAT 适当的访问标志。 PAT 需要 Packaging(创建、读取、更新和删除提要和包)范围,我之前只将 PAT 设置为具有构建范围(工件、定义、请求、对构建进行排队和更新构建属性)将工件误认为包含私有包提要!

尽管 VS 中的用户体验(2015 年和 2017 年)一点帮助都没有,但两个版本都反复弹出凭据对话框,而不是提供有关可能原因的更多信息(401 错误除外)回复,线索在 'Unauthorized' 这个词中……)。

总结使用私有 DevOps 包提要的步骤 -

  • 在 DevOps 中创建一个具有上述包范围的新 PAT
  • 在 DevOps 中,还可以从 Artifacts > Packages 下的 Connect to feed 页面获取包源 URL(这是 'nuget sources add' 的 -source 参数所必需的)
  • 使用 -

    将包源(带有凭据)添加到您的 %APPDATA%\NuGet\NuGet.config
    nuget.exe sources add -name {your_package_feed_name} -source https://pkgs.dev.azure.com/{your_org}/_packaging/{your_feed}/nuget/v3/index.json -username PATForPackages -password {the_pat_value_you_got_from_azure_devops}
    

注意:nuget sources add 会将 PAT Base-64 编码到 packageSourceCredentials 密码设置中。同样在您的用户配置文件中,NuGet.config 文件相对安全,前提是您将其保存在那里,缺点是这是主机先决条件,这是 nuget 没有内置 Azure DevOps 身份验证的结果。

对于那些在 2021 年因为同样的错误消息来到这里的人,在 pack 命令之前添加 NuGetAuthenticate@0 任务可能是缺失的部分:

- task: NuGetAuthenticate@0

- task: DotNetCoreCLI@2
  inputs:
    command: 'pack'
    packagesToPack: $(projectPath)
    includesymbols: true
    includesource: true
    versioningScheme: 'off'
    verbosityPack: Normal
  displayName: 'Dotnet Pack'