YAML文件中是否可以使用条件语句?

27

根据条件需要添加一个新的名称。 如果来自另一个 .yml 文件的变量值为“yes”,则在列表中添加一个新名称。

我的 yaml 文件中有以下代码:

JsNames:
 - name: 'jquery.min.js'
 - name: 'script.js'

我需要根据条件添加更多的名称。如果来自另一个.yml文件的变量值为"yes",则添加一个新名称,如下所示:

JsNames:
 - name: 'jquery.min.js'
 - name: 'script.js'
 - name: 'new.js'

这可能吗?

尝试了以下方法:

JsNames:
 - name: 'jquery.min.js'
 - name: 'script.js'
 - | # Test multiline yaml support
   if [[ "site.data.settings.requiredjs" == "yes" ]]; then
     name: 'new.js'
   fi

我需要根据if条件添加更多的名称。如果来自另一个.yml文件的变量值为"yes",则添加一个新名称如下:

JsNames:
 - name: 'jquery.min.js'
 - name: 'script.js'
 - name: 'new.js'

2
不要仅仅使用YAML。在这方面,YAML类似于HTML或JSON:请参阅YAML规范以了解允许的内容。 - user2864740
我建议您阅读有关YAML的资料(规范和yaml.org网站)。 1)自2006年以来,YAML文件的推荐扩展名为.yaml。 2)您似乎误以为YAML解释了文字块样式标量。 在规范中甚至没有任何提示(当然,您的程序所做的是另一回事)。 3)您似乎认为YAML具有一些点符号表示嵌套值。 再次阅读规范,它没有这个功能。 - Anthon
7个回答

17
作为对Vaibhav回答的补充:虽然 yml 不本身支持 if 语句,但一些使用 yml 文件作为指令的应用程序可能能够解析包含在 yml 中的 if 语句。GitLab 是一个显著的例子。在 GitLab 的 CI/CD 中,.gitlab-ci.yml 文件可以配置为包括 if 语句,例如:

作为对Vaibhav回答的补充:虽然yml不本身支持if语句,但一些使用yml文件作为指令的应用程序可能能够解析包含在yml中的if语句。GitLab是一个显著的例子。在GitLab的CI/CD中,.gitlab-ci.yml文件可以配置为包括if语句,例如:

job:
  script: "echo Hello, Rules!"
  rules:
    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
      when: always
    - if: '$VAR =~ /pattern/'
      when: manual
    - when: on_success

这段内容来自于https://docs.gitlab.com/ee/ci/yaml/#rules

如需了解更多信息,请参阅此答案:https://dev59.com/11QJ5IYBdhLWcg3wBRE4#55464100


在yml文件中使用bash脚本怎么样?正确的格式是什么?我有一个问题,已经尝试很长时间解决了,你能看一下吗?https://stackoverflow.com/questions/65214195/how-do-i-tell-if-a-json-file-does-not-exist-inside-a-yaml-file - wawawa
您的问题已被删除,但您可以添加一个- script:部分并将代码放入其中。每行应该以破折号开头。有时候您可能需要用引号将某些字符括起来以便被读取。 - Chris Collett

13

您不能在yml文件中添加条件,因为它只是一种文本格式化方式,而不是一种语言。但是,您仍然可以将yml文件加载到编程语言中,并根据字符串应用if else。


2
非常感谢您的回复,如果您能给我一个例子,我将不胜感激。如何将yml文件添加到编程语言中? - Muhammad Umair
请查看此帖子:https://dev59.com/AlgQ5IYBdhLWcg3w9Ykb#41975745 - vaibhav lodha
1
这不是真的。例如,在我的代码中,我使用以下代码nagiosgroup: "{{ 'srv-test' if inventory_hostname in groups['KISS_ACPT'] else 'srv-dev' }}" - Thibault Richard
1
这不是真的。例如,在我的代码中,我使用以下代码:vartodefine: "{{ 'value1' if inventory_hostname in groups['BLAH'] else 'value2' }}" - Thibault Richard
我想在yaml中运行一个bash脚本,请看一下这个问题:https://stackoverflow.com/questions/65214195/how-do-i-tell-if-a-json-file-does-not-exist-inside-a-yaml-file - wawawa

5
{{if .Env.LOCAL_VARIABLE| eq ""}}
    - /^max_wal_senders = 0\s*.*/
{{ else }}
    - /^max_wal_senders = 10\s*.*/
    - /^vacuum_defer_cleanup_age = {{.Env.VACUUM}}\s*.*/
{{ end }}


5
一个优雅的选择是,当有多个配置文件时,可以按照以下方式进行:
应用程序.yml
kafka.bootstrap-servers-nonprod: "nonprod-value"
kafka.bootstrap-servers-prod: "prod-value"
kafka.bootstrap-servers: ${kafka.bootstrap-servers-${env-type}}

application-qa.yml

env-type: "nonprod"
#kafka.bootstrap-servers will have the value: "nonprod-value"

application-prod.yml

env-type: "prod"
#kafka.bootstrap-servers will have the value: "prod-value"

4

试一下这个

vartodefine: "{{ 'value1' if condition else 'value2' }}"

这是真的吗?至少在Azure管道yaml中对我没有起作用。 - Julian Dominguez

1
请在YAML文件的条件部分尝试以下语法。
JsNames:
 - name: 'jquery.min.js'
 - name: 'script.js'
{{ if eq site.data.settings.requiredjs "yes" }}
 - name: 'new.js'
{{ end }}

-3

试试这段代码,"item" 可以替换为任何你需要的单词:

{% for item in JsNames %}
  {% if name == 'jquery.min.js' %}
    excute your code
  {% elif name == 'script.js' %}
    excute your code
  {% else %}
    excute your code
  {% endif %}
{% else %}
  some error message
{% endfor %}

哪个Python库可以支持这个功能?我尝试了默认的pyyaml,但在解析时出现错误:found character '%' that cannot start any token - Rohit Dwivedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接