只要你的替换相当简单,你就可以使用任何你想要的模板库来做到这一点。例如,您可以使用 Ruby 标准库中的 ERB 库:
#!/usr/bin/env ruby
require 'erb'
require 'yaml'
def render(template, data)
ERB.new(template).result(binding)
end
template = ARGF.file.read
ARGF.skip
until ARGF.closed?
puts "[#{ARGF.filename}]"
data = ARGF.file.read
ARGF.skip
puts render(template, YAML.load(data))
puts
end
用法
config-1.yml:
---
first_name: Yukihiro
last_name: Matsumoto
config-2.yml:
---
first_name: Alan
last_name: Kay
template.yml.erb:
person:
first_name: <%= data["first_name"] %>
last_name: <%= data["last_name"] %>
email: <%= data["first_name"].downcase %>.<%= data["last_name"].downcase %>@example.com
命令行
$ ./template_merge.rb template.yml.erb config-1.yml config-2.yml
[config-1.rb]
person:
first_name: Yukihiro
last_name: Matsumoto
email: yukihiro.matsumoto@example.com
[config-2.rb]
person:
first_name: Alan
last_name: Kay
email: alan.kay@example.com
编辑
Re:关于嵌套在顶级映射键下的数据的问题:
---
Person:
first_name: Yukihiro
last_name: Matsumoto
当您对上述数据执行 YAML.load(data) 时,生成的 Hash 不会像这样:
{ "first_name" => "Yukihiro",
"last_name" => "Matsumoto" }
...它看起来像这样:
{ "Person" => {
"first_name" => "Yukihiro",
"last_name" => "Matsumoto"
}
}
所以要访问first_name 和last_name,你只需要object["Person"]:
until ARGF.closed?
puts "[#{ARGF.filename}]"
data = YAML.load(ARGF.file.read)
ARGF.skip
puts render(template, data["Person"])
puts
end