【发布时间】:2019-09-28 20:06:48
【问题描述】:
我正在加载 YAML 文件(特别是 CloudFormation 模板),其中可能包含我想将其视为普通字符串的自定义标签(例如 !Ref),即 YAML.safe_load('Foo: !Bar baz') 将导致 {"Foo"=>"!Bar baz"} 或类似的东西。这是因为我想在将模板转储之前遍历和操作模板。我宁愿不必add_tag https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html 下的所有内容。我目前使用的是 Psych 和 Ruby 2.0,但两者都不是严格要求。
更新 1:我的意思是说基于 Ruby 2.0 之后的版本的答案很好。
更新 2:我在这个案例中添加了 CloudFormation 标记,因为注册一堆 !X -> Fn::X 转换可能是最不坏的解决方案,此时我不需要一般的 Ruby 问题.
【问题讨论】:
-
好的,假设你得到了
{"Foo"=>"!Bar baz"}。你用它做点什么,然后呢?您想将其转换回 YAML 吗?{"Foo" => "!Bar baz"}.to_yaml将导致Foo: "!Bar baz"- 这不是你开始使用的(它现在是一个字符串,不评估标签)。 -
为什么不用
File.read加载它? -
@JackTheRandom 影响 YAML 标量的输出方式看起来非常简单,您可以覆盖 ruby-doc.org/stdlib-2.0.0/libdoc/psych/rdoc/Psych/Emitter.html 中的相关方法。尽管如此,这仍然是一个好点:做类似github.com/burtcorp/regentanz/blob/… 的事情可能需要维护,但是理解和维护是微不足道的,而重新构造输出可能不是微不足道的,特别是如果
baz是一个映射或序列。我会接受这是正确的答案。 -
@Bittrance 好吧,我可以将其发布为答案。 :-)
标签: ruby yaml amazon-cloudformation