我正在尝试找到一个解决方案,其中包含带有变量的YAML模板和带有变量定义的配置文件。我在YAML模板上运行此工具,它将为每个配置文件生成一个YAML文件。
老实说,我很可能不会在线搜索正确的关键字。但是,如果任何人有任何建议或知道这样的工具来实现这一点,将非常感激:)。
答案 0 :(得分:2)
如果您的替换非常简单,您可以使用任何想要的模板库。例如,您可以使用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)
时,而不是生成的哈希看起来像这样:
{ "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