从模板生成招摇YAML?

时间:2015-12-07 17:44:12

标签: yaml swagger swagger-2.0

我正在尝试找到一个解决方案,其中包含带有变量的YAML模板和带有变量定义的配置文件。我在YAML模板上运行此工具,它将为每个配置文件生成一个YAML文件。

老实说,我很可能不会在线搜索正确的关键字。但是,如果任何人有任何建议或知道这样的工具来实现这一点,将非常感激:)。

1 个答案:

答案 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_namelast_name,您只需object["Person"]

until ARGF.closed?
  puts "[#{ARGF.filename}]"
  data = YAML.load(ARGF.file.read)
  ARGF.skip
  puts render(template, data["Person"])
  puts
end