【问题标题】:generating swagger YAML from template?从模板生成招摇的 YAML?
【发布时间】:2015-12-19 03:16:08
【问题描述】:

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

老实说,我很可能没有在网上使用正确的关键字进行搜索。但是,如果有人有任何建议或知道这样的工具来实现这一点,将不胜感激:)。

【问题讨论】:

  • 通常你的招摇是使用代码注释自动生成的。你能详细解释一下你的用例吗?
  • @Charlie 在 yaml 文件中,假设我有一个需要根据项目当前状态更改的主机名。这符合使用代码注释的描述吗?
  • 如果您没有将 Swagger UI 指向自动生成的代码,那么您可以执行此处建议的操作:stackoverflow.com/questions/30927957/… 这有帮助吗?

标签: yaml swagger swagger-2.0


【解决方案1】:

只要你的替换相当简单,你就可以使用任何你想要的模板库来做到这一点。例如,您可以使用 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_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

【讨论】:

  • 有趣的解决方案!我要试一试,看看它是否能满足我的需要。 :)
  • 您的示例不起作用,我一直在尝试将其拼凑起来我不断收到以下错误:(erb):2:in render': undefined local variable or method first_name' for main:Object (NameError) from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/erb.rb:849:in eval' from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/erb.rb:849:in result' 来自 ./yamGen.rb:6:in render' from ./yamGen.rb:21:in
    '
  • 对不起,我应该有data["first_name"] 而不是first_name。我已经更新了我的答案。
  • 谢谢乔丹!快速的问题,如果它是迭代的,我将如何访问数据。例如。如果配置文件是“ people: first_name: yukihiro last_name:matsumoto”
  • 不清楚您所说的“迭代”是什么意思。您可以编辑您的问题以包含 YAML 的示例吗?
猜你喜欢
  • 2017-12-19
  • 2022-01-23
  • 2019-07-05
  • 2021-08-22
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
相关资源
最近更新 更多