如何在YAML中设置带引号的字符串列表以适配GCP构建配置
解决ruamel.yaml生成GCP Cloud Build配置的args格式问题
我来帮你搞定这个格式问题!你需要让args既保持流样式列表(也就是["a", "b", "c"]这种括号包裹的形式),又让每个元素带上双引号。下面是具体的解决方案:
解决方案代码
import ruamel.yaml from ruamel.yaml.scalarstring import DoubleQuotedScalarString as dq from ruamel.yaml.comments import CommentedSeq yaml = ruamel.yaml.YAML() yaml.indent(sequence=2) yaml.preserve_quotes = True yaml.default_flow_style = None CF2_cloudbuild = { 'steps': [ { 'name': dq("gcr.io/cloud-builders/gcloud"), # 用CommentedSeq替代普通列表,包裹带双引号的元素 'args': CommentedSeq([dq("functions"), dq("deploy"), dq("publish_resized")]), 'timeout': dq("1600s") } ] } # 强制将args序列设置为流样式 CF2_cloudbuild['steps'][0]['args'].fa.set_flow_style() with open("file.yaml", 'w') as fp: yaml.dump(CF2_cloudbuild, fp)
为什么这个方法有效?
- CommentedSeq的作用:ruamel.yaml中的
CommentedSeq是专门用来处理YAML序列的类,它允许我们单独控制序列的渲染样式(块样式/流样式),而普通列表会继承全局的default_flow_style设置。 - set_flow_style():调用这个方法可以强制将该序列渲染为流样式(用方括号包裹),而不是默认的块样式(每行一个元素)。
- DoubleQuotedScalarString:确保每个元素都被双引号包裹,满足GCP构建配置的要求。
运行这段代码后,生成的file.yaml内容会完全符合你的需求:
steps: - name: "gcr.io/cloud-builders/gcloud" args: ["functions", "deploy", "publish_resized"] timeout: "1600s"
内容的提问来源于stack exchange,提问作者Wojtek
相关产品推荐
相关产品推荐

