我正在尝试检索已推送到 Azure DevOps Artifacts(项目)源中的自定义 NuGet 包。
但是 NuGetCommand@2 失败并出现错误:
NU1301:无法加载源的服务索引 https://pkgs.dev.azure.com/[COMPANY_NAME]/_packaging/[FEED_NAME]/nuget/v3/index.json。
我的构建 yaml 文件有以下步骤:
steps:
- task: NuGetToolInstaller@1
# Required for custom access to Artifacts
- task: PowerShell@2
displayName: "Install Artifacts Provider"
inputs:
targetType: 'inline'
script: |
Write-Host "Install Artifacts Provider"
Invoke-Expression "& { $(irm https://aka.ms/install-artifacts-credprovider.ps1) } -AddNetfx"
- task: NuGetAuthenticate@1
- task: NuGetCommand@2
inputs:
command: 'restore'
FeedsToUse: 'select'
restoreSolution: '$(solution)'
vstsFeed: [FEED_NAME]
在我的 nuget.config 文件中,我有以下配置:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="[FEED_NAME]" value="https://pkgs.dev.azure.com/[COMPANY_NAME]/[PROJECT_NAME]/_packaging/[FEED_NAME]/nuget/v3/index.json" />
</packageSources>
<packageSourceCredentials>
<[FEED_NAME]%>
<add key="Username" value="[USER_NAME]" />
<add key="Password" value="[PAC]" />
</[FEED_NAME]>
</packageSourceCredentials>
</configuration>
在工件权限设置下,我已为项目构建服务授予协作者角色。
通过此设置,我在日志中收到以下消息:
NuGetAuthenticate 步骤给出此输出并且成功:
Setting up the credential provider to use the identity '[PROJECT_NAME] Build Service ([COMPANY_NAME])' for feeds in your organization/collection starting with:
https://pkgs.dev.azure.com/[COMPANY_NAME]/
https://[COMPANY_NAME].pkgs.visualstudio.com/
NuGetCommand 步骤失败并显示以下日志:
Using D:\a\_tasks\NuGetCommand_333b11bd-d341-40d9-afcf-b32d5ce6f23b\2.238.1\CredentialProviderV2\plugins\netfx\CredentialProvider.Microsoft\CredentialProvider.Microsoft.exe as a credential provider plugin.
Feeds used:
C:\Program Files\dotnet\library-packs
https://api.nuget.org/v3/index.json
https://pkgs.dev.azure.com/[COMPANY_NAME]/_packaging/[FEED_NAME]/nuget/v3/index.json
...
[CredentialProvider]Handling 'Request' 'GetAuthenticationCredentials'. Time elapsed in ms: 4 - Payload: {"Uri":"https://pkgs.dev.azure.com/[COMPANY_NAME]/_packaging/[FEED_NAME]/nuget/v3/index.json","IsRetry":false,"IsNonInteractive":true,"CanShowDialog":true}
[CredentialProvider]Creating a progress reporter with interval: 00:00:02
[CredentialProvider]Handling auth request, Uri: https://pkgs.dev.azure.com/[COMPANY_NAME]/_packaging/[FEED_NAME]/nuget/v3/index.json, IsRetry: False, IsNonInteractive: True, CanShowDialog: True
[CredentialProvider]URI: https://pkgs.dev.azure.com/[COMPANY_NAME]/_packaging/[FEED_NAME]/nuget/v3/index.json
[CredentialProvider]VstsBuildTaskServiceEndpointCredentialProvider - This credential provider must be run under the Team Build tasks for NuGet with external endpoint credentials. Appropriate environment variable needs to be set.
...
[CredentialProvider]Skipping NuGetCredentialProvider.CredentialProviders.VstsBuildTaskServiceEndpoint.VstsBuildTaskServiceEndpointCredentialProvider, cannot provide credentials for https://pkgs.dev.azure.com/[COMPANY_NAME]/_packaging/[FEED_NAME]/nuget/v3/index.json
...
NU1301: Unable to load the service index for source https://pkgs.dev.azure.com/[COMPANY_NAME]/_packaging/[FEED_NAME]/nuget/v3/index.json.
奇怪的是,所有源 URL 都删除了项目名称。 而不是
https://pkgs.dev.azure.com/[COMPANY_NAME]/[PROJECT_NAME]/_packaging/[FEED_NAME]/nuget/v3/index.json
他使用的网址不带项目名称:
https://pkgs.dev.azure.com/[COMPANY_NAME]/_packaging/[FEED_NAME]/nuget/v3/index.json
根据
Setting up the credential provider to use the identity '[PROJECT_NAME] Build Service ([COMPANY_NAME])' for feeds in your organization/collection starting with:...
,您的管道正在使用项目级构建服务帐户。您可以检查目标项目中是否打开了将非发布管道的作业授权范围限制到当前项目选项。转到项目设置 -> 设置(在管道下)。
根据
Unable to load the service index for source https://pkgs.dev.azure.com/[COMPANY_NAME]/_packaging/[FEED_NAME]/nuget/v3/index.json.
,您正在尝试从 组织级别 源恢复。
当启用将非发布管道的作业授权范围限制为当前项目时,所有非发布管道的访问范围将缩小到当前项目。预计无法访问组织级别的源。
如果您想访问组织级源,请在受影响的项目中关闭将作业授权范围限制为非发布管道的当前项目。
如果您想使用
nuget.config
文件中配置的 feed,请将 feedsToUse
设置为 config
,并在 nuget.config
中指定 nugetConfigPath
文件的路径。 (如果您只想使用一个 Azure 工件源中的包,则无需使用 nuget.config
文件和配置工件提供程序。将 FeedsToUse
中的 NuGetCommand@2
设置为 select
并选择您的目标源就足够了。 )
- task: NuGetCommand@2
inputs:
command: 'restore'
restoreSolution: '**/*.sln'
feedsToUse: 'config'
nugetConfigPath: '{Path to nuget.config}'