【问题标题】:How do I flatten a YAML file so it has no aliases (in ruby)?如何展平 YAML 文件以使其没有别名(在 ruby​​ 中)?
【发布时间】:2019-04-09 15:59:46
【问题描述】:

假设我有:

-: &defaults
  client_id: 'invalid_client_id'
  client_secret: 'secret'

production:
  <<: *defaults
staging:
  <<: *defaults

我想阅读它,然后将其展平,这样就没有别名了。我该怎么做?我更喜欢使用当前 YAML 库的某些配置的解决方案,而不是混合在一起的东西(如果有意义的话)。

IOW:

production:
  client_id: 'invalid_client_id'
  client_secret: 'secret'
staging:
  client_id: 'invalid_client_id'
  client_secret: 'secret'

编辑:

从 YAML.load 执行 YAML.dump 的建议有效,但它在文档中保留了原始别名:

---
"-":
  client_id: invalid_client_id
  client_secret: secret
production:
  client_id: invalid_client_id
  client_secret: secret
staging:
  client_id: invalid_client_id
  client_secret: secret

这不是我所需要的。很高兴接受答案,但想看看有没有其他想法。

【问题讨论】:

  • 它不离开它离开节点的别名。别名是&amp;defaults。这些是解析器中的独立关注点
  • 如果别名嵌套在另一个级别怎么办?
  • 我才意识到,是的,有一个节点和一个别名!

标签: ruby yaml


【解决方案1】:

您在修改后的问题中想要的内容会破坏 YAML 本身。在这种情况下,您应该手动删除您的初始别名:

require 'yaml'
yml = YAML.load(File.open 't.yml')
yml.delete('-')
yml.to_yaml

【讨论】:

    【解决方案2】:

    只需使用YAML.dump

    require 'yaml'
    yaml = YAML::load(File.open('t.yml'))
    YAML.dump yaml
    

    【讨论】:

    • 有什么方法可以告诉 YAML(或 psych)我只是想让它变平?这是一个很好的答案,我只是希望有一种不那么迂回的方式。
    • 尽管我尽了最大努力,但这似乎是唯一的解决方案。
    • 实际上,这并不完全有效:它会在文档中留下别名。有没有其他办法?
    猜你喜欢
    • 2014-08-21
    • 2021-08-23
    • 2011-01-17
    • 1970-01-01
    • 2011-04-22
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多