0

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

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

supported_databases:
  - mysql
  - postgres

我的 cookiecutter 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来防止呈现无效的 YAML。

有没有更简洁的方法来实现这一点?

谢谢你的帮助。

4

1 回答 1

2

您可以利用 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。

注意:代码未经测试。

于 2018-01-24T11:49:26.213 回答