如何通过DevOps构建流水线将.snupkg源链接包发布到MyGet
解决Azure DevOps NuGetCommand任务推送.snupkg到MyGet时的401未授权问题
针对你遇到的本地nuget push正常、但DevOps构建任务报401的问题,可尝试以下几种解决方案:
1. 显式指定源地址与API密钥,绕开凭据管理
DevOps的publishFeedCredentials在处理MyGet源时可能存在隐式配置问题,直接在任务中传入源和密钥参数更可靠:
- task: NuGetCommand@2 displayName: 'Publish Symbols ($(Build_Major).$(Build_Minor).$(Build_Patch))' condition: succeeded() inputs: command: 'push' packagesToPush: 'projects/${{ parameters.projectName }}/src/**/bin/**/*.$(Build_Major).$(Build_Minor)*.snupkg' nuGetFeedType: 'external' commandArgs: '-Source https://company.myget.org/F/myfeed/api/v3/index.json -ApiKey $(MyGetApiKey)'
注意:将MyGetApiKey作为DevOps的机密变量存储,确保密钥安全且与本地使用的一致。
2. 匹配本地使用的NuGet版本
日志显示任务使用NuGet 6.4.0,若本地使用的是其他版本,版本兼容性可能导致认证异常。可在任务中指定与本地一致的NuGet版本:
- task: NuGetCommand@2 displayName: 'Publish Symbols ($(Build_Major).$(Build_Minor).$(Build_Patch))' condition: succeeded() inputs: command: 'push' packagesToPush: 'projects/${{ parameters.projectName }}/src/**/bin/**/*.$(Build_Major).$(Build_Minor)*.snupkg' nuGetFeedType: 'external' publishFeedCredentials: 'MyGet - Test' nuGetVersionSpec: '5.11.0' # 替换为你本地使用的NuGet版本号
3. 改用DotNetCoreCLI任务推送
DotNet CLI的push命令在处理外部源认证时更稳定,可替代NuGetCommand任务:
- task: DotNetCoreCLI@2 displayName: 'Publish Symbols to MyGet' condition: succeeded() inputs: command: 'push' packagesToPush: 'projects/${{ parameters.projectName }}/src/**/bin/**/*.$(Build_Major).$(Build_Minor)*.snupkg' arguments: '--source https://company.myget.org/F/myfeed/api/v3/index.json --api-key $(MyGetApiKey)'
4. 确认MyGet API密钥权限
虽然本地可用,但需再次确认该API密钥在MyGet后台具备**推送包(含符号包)**的权限:
- 登录MyGet管理后台,进入目标Feed的「API Keys」页面
- 检查对应密钥的权限列表,确保勾选了「Push packages」选项
内容的提问来源于stack exchange,提问作者Mike Christensen
相关产品推荐
相关产品推荐

