尽管两个条件都为真,但表达式未计算为真
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)) }}:
- 如果只是第一个条件,后面的
bash
在service = 'api'
时执行。
- 如果只是第二个条件,后面的
bash
不会执行这让我相信它会回来false
.
- 因此,同时具备这两个条件,它的计算结果为
false
。
所以 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
.
这是我在这个特定阶段所拥有的:
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)) }}:
- 如果只是第一个条件,后面的
bash
在service = 'api'
时执行。 - 如果只是第二个条件,后面的
bash
不会执行这让我相信它会回来false
. - 因此,同时具备这两个条件,它的计算结果为
false
。
所以 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
.