我应该如何使用 cookiecutter 整齐地渲染 YAML 数组?

How should I render YAML arrays neatly with cookiecutter?

我有一个 cookiecutter 模板,我想根据一些选项呈现 YAML 文件。

举个简单的例子,假设呈现的 YAML 文件可能如下所示:

supported_databases:
  - mysql
  - postgres

我的千篇一律 JSON 看起来像这样:

{
  "mysql": ["yes", "no"],
  "postgres": ["yes", "no"]
}

我的 YAML 文件将充满 ifs 以支持所有 4 种有效组合:

{%- if cookiecutter.mysql == 'yes' or cookiecutter.postgres == 'yes' %}
supported_databases:
{%- if cookiecutter.mysql == 'yes' %}
  - mysql
{%- endif %}
{%- if cookiecutter.mysql == 'yes' %}
  - postgres
{%- endif %}
{%- endif %}

需要外部 if 以防止在两个选项均为 'no' 的情况下呈现无效的 YAML。

有没有更简洁的方法来完成此操作?

感谢您的帮助。

您可以利用 YAML 的流样式:

supported_databases: [
  {% for db_type in ['mysql', 'postgres'] %}
    {% if cookiecutter[db_type] == 'yes' %}{{ db_type }},{% endif %}
  {% endfor %}
  ]

如果两个选项都是 no,则呈现:

supported_databases: [
  ]

哪个是有效的 YAML,表示一个空序列作为 supported_databases 的值。

同时提供这两个选项,您将得到

supported_databases: [
    mysql,
    postgres,
  ]

这也是有效的 YAML,因为与 JSON 不同,YAML 允许在序列中使用尾随逗号。此 YAML 在语义上等同于您在问题中显示的 YAML。

注意:代码未经测试。