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

Azure Pipeline:如何用each语句遍历动态生成的数组?

解决Azure Pipeline动态数组遍历执行步骤的问题

问题根源

你遇到的核心问题是Azure Pipeline的表达式执行时机差异:

  • ${{ each }}属于编译时表达式,在Pipeline启动前就会完成解析,此时跨作业传递的运行时变量还未被赋值,只能拿到变量的字面量字符串(比如$[ dependencies.BuildAndTest.outputs['GetChangedProjects.nuGetPackagesToBuild'] ]),无法拆分出实际的数组元素。
  • 而跨作业传递的变量是运行时变量,只有在作业执行阶段才会被解析为实际值,这就导致编译时的each循环无法获取到动态生成的数组内容。

解决方案

方法1:用脚本直接遍历执行(最直接灵活)

在目标作业中,使用PowerShell或Bash脚本将运行时变量拆分为数组,然后循环执行每个包的构建逻辑,无需依赖编译时的each循环:

jobs:
- job: BuildAndTest
  steps:
  - script: |
     echo "##vso[task.setvariable variable=nuGetPackagesToBuild;isoutput=true]Configuration,Logging,UnitTests.Core"
    name: GetChangedProjects

- job: CreateChangedNuGetPackages
  dependsOn: BuildAndTest
  variables:
    nuGetPackagesToBuildFromBuildAndTestJob: $[ dependencies.BuildAndTest.outputs['GetChangedProjects.nuGetPackagesToBuild'] ]  
  steps:
    - pwsh: |
        # 将逗号分隔的字符串拆分为数组
        $packages = '$(nuGetPackagesToBuildFromBuildAndTestJob)' -split ','
        foreach ($pkg in $packages) {
          Write-Host "=== 开始构建NuGet包: $pkg ==="
          # 替换为实际的构建命令,比如dotnet pack、nuget pack等
          # dotnet pack "$pkg" --configuration Release --output $(Build.ArtifactStagingDirectory)
        }
      displayName: '批量构建变更的NuGet包'

方法2:动态生成Pipeline步骤(适合需要独立步骤的场景)

如果需要为每个包生成独立的Pipeline步骤(比如单独查看每个包的构建日志),可以用脚本通过##vso[task.addtask]命令动态添加任务:

jobs:
- job: BuildAndTest
  steps:
  - script: |
     echo "##vso[task.setvariable variable=nuGetPackagesToBuild;isoutput=true]Configuration,Logging,UnitTests.Core"
    name: GetChangedProjects

- job: CreateChangedNuGetPackages
  dependsOn: BuildAndTest
  variables:
    nuGetPackagesToBuildFromBuildAndTestJob: $[ dependencies.BuildAndTest.outputs['GetChangedProjects.nuGetPackagesToBuild'] ]  
  steps:
    - pwsh: |
        $packages = '$(nuGetPackagesToBuildFromBuildAndTestJob)' -split ','
        $taskCounter = 1
        foreach ($pkg in $packages) {
          # 动态添加CmdLine任务,执行构建命令
          Write-Host "##vso[task.addtask]CmdLine@2"
          Write-Host "##vso[task.setvariable variable=task.name;issecret=false]BuildNuGetPackage_$taskCounter"
          Write-Host "##vso[task.setvariable variable=task.displayName;issecret=false]构建NuGet包: $pkg"
          Write-Host "##vso[task.setvariable variable=task.script;issecret=false]echo '开始构建 $pkg' && dotnet pack $pkg --configuration Release"
          $taskCounter++
        }
      displayName: '生成动态构建步骤'

补充说明

如果硬编码变量能正常工作,是因为硬编码的字符串属于编译时已知值,${{ split() }}在编译阶段就能正确拆分出数组,each循环自然能遍历每个元素。但动态生成的变量只有运行时才会有值,所以必须用运行时的脚本逻辑来处理。

内容的提问来源于stack exchange,提问作者GSFatPracctice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:58:18