首页 > 解决方案 > 在将文件内容打印到 YAML 时保持 YAML 缩进(使用 bash 脚本)

问题描述

我需要将 python 文件的内容打印到 YAML 文件中,而不会弄乱 YAML 文件的缩进。YAML 文件中执行此操作的部分是对将传递到 Bash 脚本中的命令的描述,因此我们需要使用 Bash 脚本语法来完成此操作。例如,以下硬编码代码 WORKS。请注意“cat”行是如何以适当的缩进输出 script.py 的内容的:

在此处输入图像描述

诀窍是在尝试从另一个文件中读取 Python 时将其转换为该格式。实际上,为了创建该屏幕截图,我必须在生成文件后实际进入该文件并添加一堆空格以使其看起来正确。添加空格后,文件按预期工作。这是我手动编辑之前错误输出的样子:

在此处输入图像描述

有趣的是,python 的第一行(绿色箭头)从正确的行开始。但是其余的行都在左边距并且不正确(红色箭头)。

这是我用来将我的代码(在 script.py 中)放入构建规范的代码:

注意:${Script} 是对我的 script.py 文件的引用。此变量正在文件中的其他位置设置。

version: 0.2
phases:
  install:
    commands:
      - apt-get update -y
  build:
    commands:
      - git config --global credential.helper '!aws codecommit credential-helper $@'
      - git config --global credential.UseHttpPath true
      - |
        cat >> scrypt.py <<EOL
        ${Script}
        EOL

标签: bashyamlamazon-cloudformation

解决方案


所以问题是 !Include 函数将 script.py 的内容替换为 ${Script} 并不关心我们是否在 YAML 文件中,所以每当有新行时,它都会将它们全部抛出左边的路。

有两种方法可以解决这个问题。首先,我们可以简单地向 script.py 本身添加空格,这样当它的值被替换为 ${Script} 时,它们就会出现在正确的位置。

我们最终做的事情(因为第一种方法非常hacky且难以维护)是简单地放弃尝试!包含文件,而只是将整个 script.py 内容粘贴到 YAML 文件中,确切的位置${Script} 最初是。所以结果看起来像这样:

version: 0.2
phases:
  install:
    commands:
      - apt-get update -y
  build:
    commands:
      - git config --global credential.helper '!aws codecommit credential-helper $@'
      - git config --global credential.UseHttpPath true
      - pip3 install --quiet boto3
      - pip3 install --quiet GitPython
      - |
        cat > script.py <<EOL
        import boto3
        import git
        etc. etc. etc.
        EOL
      - python script.py

推荐阅读