Kevin Lu 是正确的,但这里有一些额外的背景说明它为什么会这样工作。
${{ <expression> }} 语法仅在模板编译时进行评估。这意味着尚未初始化任何用户变量。如果您尝试检查它们的值,它将始终返回一个空值。虽然${{ <expression> }} 语法对于有条件地输出模板行进行处理很方便,但不会设置用户变量值来限制您可以使用if 执行的操作。
$[ <expression> ] 语法在运行时进行评估。变量将被初始化,但是您不能直接使用if 语法直接有条件地输出不同的变量值。但是,您可以使用切刀黑客,正如 Simon Alling 在this 帖子中的回答所记录的那样。
参考:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions
这个非常简单的 YAML 管道说明了这个概念:
stages:
- stage: TestVarsCompile
variables:
- name: state_prefix
# $subdirectory is not defined
${{ if eq(variables['subdirectory'], '') }}:
value: 'subdirectory-not-set'
# $subdirectory is defined
${{ if ne(variables['subdirectory'], '') }}:
value: 'subdirectory-set'
jobs:
- job:
steps:
- checkout: none
- script: |
echo $(subdirectory)
echo $(state_prefix)
- stage: TestVarsRuntime
variables:
state_prefix: $[
replace(
replace(
eq(variables['subdirectory'], ''),
True,
'sub-directory-not-set'
),
False,
'sub-directory-set'
)
]
jobs:
- job:
steps:
- checkout: none
- script: |
echo $(subdirectory)
echo $(state_prefix)
TestVarsCompile 阶段输出总是返回以下输出,无论是否设置了 subdirectory 变量:
some value
subdirectory-not-set
如果设置了subdirectory 变量,TestVarsRuntime 阶段输出将返回以下内容:
some value
subdirectory-set