如何在保持缩进的同时将 .yaml.erb 嵌入到另一个 .yaml.erb 中?

How to embed a .yaml.erb into another .yaml.erb while keeping indentation?

假设我有两个文件,parent.yaml.erbchild.yaml.erb,我想包括child.yaml.erb 的内容在 parent.yaml.erb 中并在 parent.yaml.erb 的上下文中计算。示例:

parent.yaml.erb:

name: parent
first:
  second:
    third: something
    <%= ERB.new(File.read('child.yaml.erb')).result(binding) %>

child.yaml.erb:

<% if some_condition %>
a:
  b:
    c: <%= 2+2 %>
<% end %>

我期望这样的结果:

expected_result.yaml:

name: parent
first:
  second:
    third: something
    a:
      b:
        c: 4

我得到的是:

result.yaml:

name: parent
first:
  second:
    third: something
    *[whitespace ends here]*
a:

  b:

    c: 4

使用 documentation 中的 trim_mode 选项没有帮助。

如何使用正确的缩进实现预期结果?

ruby 2.6.4p104 (2019-08-28 revision 67798) [x86_64-linux]

你可以这样做。

parent.yaml.erb

name: parent
first:
  second:
    third: something
<%- content = ERB.new(File.read("child.yaml.erb"), nil, "-").result().gsub(/^/,"    ") -%> 
<%= content -%> 

child.yaml.erb

<% if some_condition -%>
a:
  b:
    c: <%= 2+2 %>
<% end -%>

一些解释

  • 我必须通过将 nil"-" 作为第二个和第三个参数传递给 ERB.new() 来启用 trim 模式。
  • 启用 trim 模式后,我可以 trim 不需要的白色 space 使用 <$--%>
  • 我用 gsub 缩进了 4 spaces。

当然,如评论中所述,将 YAML 数据作为散列读入内存可能会更好,尽管我确实意识到这样会失去对输出的很多控制。