尽管两个条件都为真,但表达式未计算为真

Expression does not evaluate to true despite both conditions being true

这是我在这个特定阶段所拥有的:

parameters:
- name: services
  type: object
  default:
  - admin
  - admin-v2
  - api
  - client

stages:
- stage: UnitTests
  displayName: Run unit tests on service...
  dependsOn: Changed
  condition: succeeded()
  variables:
    apiChanged: $[ stageDependencies.Changed.Changes.outputs['detectChanges.apiChanged'] ]
  jobs:
  - job: UnitTests
    condition: or(eq(stageDependencies.Changed.Changes.outputs['detectChanges.anyServicesChanged'], true), eq(variables['Build.Reason'], 'Manual'))
    displayName: Running unit tests...
    steps:
    - ${{ each service in parameters.services }}:
      - ${{ if and(eq(service, 'api'), eq(variables.apiChanged, true)) }}:
        - bash: |
            echo "Now running ${{ service }} unit tests..."

有问题的行是:

- ${{ if and(eq(service, 'api'), eq(variables.apiChanged, true)) }}:

所以 eq(variables.apiChanged, true) 显然是问题所在。

我已通过执行以下操作验证 apiChanged = true

- bash: |
    echo $(apiChanged)

我在 - ${{ each service in parameters.services }}: 之前做过这个,它又回来了 true

我也试过 eq(variables.adminV2Changed, true)eq(variables.adminV2Changed, 'true').

对于为什么会发生这种情况以及如何解决它有什么建议吗?

在 Azure DevOps 中,语法 ${{}} 用于编译时,$[] 用于运行时表达式。这意味着当${{}}个表达式执行时,$[]个表达式还没有执行。

换句话说,在编译时表达式中,您可以访问参数静态定义变量.

在您的例子中,编译时表达式包含一个需要执行的变量 apiChanged。它的值是$[stageDependencies.Changed.Changes.Outputs['detectChanges. ApiChanged]]而不是计算值true.