ruamel.yaml处理GitHub Actions工作流的格式保留问题咨询
解决ruamel.yaml处理GitHub Actions工作流的格式问题
问题1:避免列表项被转为大括号格式
ruamel.yaml默认会对短字典采用流式(大括号)格式输出,要全局禁用这种行为,只需在初始化YAML对象时设置default_flow_style=False,确保所有字典都以块级格式输出:
from ruamel.yaml import YAML yaml = YAML() yaml.default_flow_style = False # 禁用流式格式,强制块级输出 # 读取原工作流文件 with open("your_workflow.yaml", "r") as f: workflow_data = yaml.load(f) # 执行迁移修改操作... # 保存修改后的文件 with open("updated_workflow.yaml", "w") as f: yaml.dump(workflow_data, f)
该配置会让所有列表中的字典项保持- uses: actions/checkout@v3的格式,不会转为大括号形式。
问题2:保留多行run命令的|格式
要保留YAML的块级多行字符串(|格式),需要确保ruamel.yaml保留原始标量样式,同时配置正确的输出参数:
- 启用
preserve_quotes确保引号和格式不被修改; - 设置足够大的
width避免字符串被自动换行; - 若修改或新增多行run命令,使用
PreservedScalarString来指定块级标量。
示例代码:
from ruamel.yaml import YAML from ruamel.yaml.scalarstring import PreservedScalarString yaml = YAML() yaml.default_flow_style = False yaml.preserve_quotes = True yaml.width = 4096 # 足够大的宽度防止自动换行 # 加载原工作流 with open("your_workflow.yaml", "r") as f: workflow_data = yaml.load(f) # 示例:定位到目标步骤并修改run命令(保持|格式) for job in workflow_data.get("jobs", {}).values(): for step in job.get("steps", []): if step.get("name") == "Register RepoDigests": # 使用PreservedScalarString包裹多行命令 step["run"] = PreservedScalarString("""sed -i "/$IMAGE_NAME_FRONTEND@sha256/c frontendImage: $IMAGE_NAME_FRONTEND@$IMAGE_DIGEST_FRONTEND" it/k8s/admin/values.yaml""") # 保存修改后的工作流 with open("updated_workflow.yaml", "w") as f: yaml.dump(workflow_data, f)
如果是直接加载已有|格式的run命令,只要配置了上述参数,ruamel.yaml会自动保留原始的块级格式,无需额外处理。
内容的提问来源于stack exchange,提问作者Moritz Schmitz v. Hülst
相关产品推荐
相关产品推荐

