请教:Azure DevOps不支持snupkg是否需用仅Windows_NT代理的PublishSymbols任务?
关于Azure DevOps符号发布的疑问解答
你的理解不完全准确,具体细节如下:
1. Azure DevOps 支持 snupkg 格式
Azure DevOps Artifacts 完全支持 snupkg 符号包格式,你可以直接通过 dotnet nuget push 将 snupkg 推送到私有源。你的脚本中注释掉了 -p:SymbolPackageFormat=snupkg 参数,启用它就能生成 snupkg,替代传统的 .symbols.nupkg。
2. PublishSymbols@2 任务的作用与限制
PublishSymbols@2 确实只能在 Windows 代理上运行,因为它依赖 Windows 专属的符号存储工具链,但这个任务的作用是将符号发布到 Azure DevOps 的符号服务器,而非 NuGet 源。如果你的需求是通过 NuGet 分发符号(用 snupkg),完全不需要这个任务,也不用限定代理系统。
3. 对你现有脚本的优化建议
- 取消
dotnet pack中-p:SymbolPackageFormat=snupkg的注释,生成 snupkg 格式的符号包 - 修改 NuGetCommand@2 的
packagesToPush参数为:
这样可以同时推送主包和 snupkg 符号包$(Build.ArtifactStagingDirectory)/pack/**/*.nupkg;$(Build.ArtifactStagingDirectory)/pack/**/*.snupkg - 如果你不需要将符号发布到 Azure DevOps 符号服务器,可以直接移除 PublishSymbols@2 及对应的检查任务
- 若确实需要使用符号服务器,建议直接在 PublishSymbols@2 任务中添加
demands: Agent.OS -equals Windows_NT,替代额外的 PowerShell 检查任务,配置更简洁
你提供的原始脚本
- task: PowerShell@2 displayName: 'dotnet pack' condition: ne(variables['projectsToPack'], '') inputs: targetType: 'inline' script: | $packVersionSuffix = '$(packVersionSuffix)' $bo = '$(Build.ArtifactStagingDirectory)' # 注:此处拼写为'artifact'(原文如此) $projectsToPack = '$(projectsToPack)'.Split(';') $projectsToPush = '$(projectsToPush)'.Split(';') foreach( $csproj in Get-ChildItem -Recurse -Filter *.csproj ) { if($projectsToPack.Contains($csproj.Name)) { $outputDirectory = "$bo\pack" if( -Not $projectsToPush.Contains($csproj.Name)) { $outputDirectory = "$bo\pack_no_push" } $csprojFullName = $csproj.FullName if('$(packVersionSuffix)' -ne '') { dotnet pack --no-restore --no-build --configuration $(buildConfiguration) --include-source --include-symbols --version-suffix "$packVersionSuffix" --output "$outputDirectory" "$csprojFullName" } else { dotnet pack --no-restore --no-build --configuration $(buildConfiguration) --include-source --include-symbols --output "$outputDirectory" "$csprojFullName" # 不清楚为何.FullName不仅不需要,甚至无法生效 } # -p:SymbolPackageFormat=snupkg } } if (Test-Path "$bo\pack_no_push") { Remove-Item -Force -Recurse "$bo\pack_no_push" } - task: NuGetCommand@2 displayName: 'Push packages' condition: and( succeeded(), ne(variables['projectsToPush'], ''), ne(variables['Build.SourceBranchName'], 'merge')) # 不要为PR构建推送包 inputs: command: 'push' packagesToPush: '$(Build.ArtifactStagingDirectory)/pack/**/*.symbols.nupkg' nuGetFeedType: 'internal' publishVstsFeed: 'Company' allowPackageConflicts: false #skipDuplicates不受支持:( 因此需要通过projectsToPush进行繁琐处理 - task: PowerShell@2 displayName: 'Windows_NT for PublishSymbols@2' condition: and( succeeded(), ne(variables['projectsToPush'], ''), ne(variables['Build.SourceBranchName'], 'merge'), ne(variables['Agent.OS'], 'Windows_NT')) inputs: targetType: 'inline' script: | echo "Task 'PublishSymbols@2' requires Agent.OS -equals Windows_NT (add this demand to your job)." exit 1 - task: PublishSymbols@2 displayName: 'Push symbols' condition: and( succeeded(), ne(variables['projectsToPush'], ''), ne(variables['Build.SourceBranchName'], 'merge')) # 不要为PR构建推送包 inputs: SearchPattern: '**/bin/**/*.pdb' # 包含未发布的包,但这些包的符号应与之前的一致 SymbolServerType: 'TeamServices' IndexSources: false # 使用SourceLink时无需设置此项,参考链接:https://learn.microsoft.com/en-us/azure/devops/pipelines/artifacts/symbols?view=azure-devops&viewFallbackFrom=vsts
内容的提问来源于stack exchange,提问作者Richard Barraclough
相关产品推荐
相关产品推荐

