You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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保留原始标量样式,同时配置正确的输出参数:

  1. 启用preserve_quotes确保引号和格式不被修改;
  2. 设置足够大的width避免字符串被自动换行;
  3. 若修改或新增多行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:05:13