Azure DevOps YAML 复杂对象内字符串数组配合coalesce使用无法识别问题
这个问题是Azure DevOps YAML模板编译期的内部解析器缺陷导致的,具体原因如下:
你输出的带lit、line、col字段的对象,是YAML解析器内部用来标记字面量节点代码位置的元数据对象,正常情况下这些数据仅在编译内部流转,不会暴露给模板语法的输出。
触发该缺陷的必要条件就是你问题场景里的写法:
- 先遍历复杂对象的嵌套属性(
parameters.complexObject下的o.foods) - 将该嵌套数组属性作为
coalesce函数的第一个参数传入 - 再遍历
coalesce的返回值
前两个示例没有触发问题的原因:
- 可用示例1没有使用
coalesce函数,直接遍历嵌套数组,解析器可以正确识别数组元素是字符串字面量,不会泄露内部元数据 - 可用示例2中
coalesce的两个参数都是顶层参数(parameters.foods、parameters.animals),解析器对顶层参数的类型处理有单独的优化路径,不会触发该缺陷
临时修复方案
你可以选择以下任意一种方式规避问题:
- 调换
coalesce的参数顺序,优先把顶层参数放在第一位:
- ${{ each f in coalesce(parameters.animals, o.foods) }}:
- 用
if判断替代coalesce,完全避开两个操作的组合:
steps: - ${{ each o in parameters.complexObject }}: - ${{ if o.foods }}: - ${{ each f in o.foods }}: - script: echo '${{convertToJson(f)}}' - script: echo '${{f}}' - ${{ else }}: - ${{ each f in parameters.animals }}: - script: echo '${{convertToJson(f)}}' - script: echo '${{f}}'
内容的提问来源于stack exchange,提问作者Rachel
相关产品推荐
相关产品推荐

