考虑以下 Azure yaml 管道和模板,它们使用convertToJson函数将对象参数转换为 json 字符串:
parameters:
- name: foo
type: string
default: 'b"ar'
trigger: none
pool:
vmImage: 'ubuntu-latest'
variables:
- name: foo
value: 'b"ar'
steps:
- checkout: none
- template: /pipelines/steps/set-settings.yaml
parameters:
settings:
fooLiteral: 'b"ar'
fooParameter: ${{ parameters.foo }}
fooCompiledVariable: ${{ variables.foo }}
fooRuntimeVariable: $(foo)
模板/pipelines/steps/set-settings.yaml:
parameters:
- name: settings
type: object
steps:
- script: |
echo $SETTINGS
displayName: 'Display settings'
env:
SETTINGS: ${{ convertToJson(parameters.settings) }}
运行管道时,为什么除了 之外所有值都会得到正确转义fooRuntimeVariable
?
测试相同的 YAML 示例,我可以重现相同的问题。
问题的根本原因是
$(foo)
当表达式:ConvertToJson执行时,宏变量()没有扩展。当 ConvertToJson 表达式执行时,fooRuntimeVariable将保留 的值
$(foo)
而不是将值扩展为'b"ar'
。所以它的实际转换结果:
在脚本任务中打印后,
$(foo)
将扩展为以下值:'b"ar'
。为了证明这一点,我在模板中添加了条件来检查转换结果:
以下是我的示例:
模板 YAML:
主要 YAML:
当我们运行管道时,显示设置任务将跳过。然后我们可以检查条件结果:它将显示
$(foo)
fooRuntimeVariable 。总结一下,当我们使用ConvertToJson Expression时,我建议我们可以使用编译时表达式(
${{xxx}}
)来使用变量。