You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请教: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 参数为:
    $(Build.ArtifactStagingDirectory)/pack/**/*.nupkg;$(Build.ArtifactStagingDirectory)/pack/**/*.snupkg
    
    这样可以同时推送主包和 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:10:20