nodejs模板化yaml文件

时间:2018-03-21 11:47:53

标签: node.js yaml

我正在寻找可以将运行时参数从我的程序解析为yaml文件的节点模块(或其他东西)。

例如在kubernetes yamls

metadata:
  name: $PROJECT_NAME
  labels:
    service: $SERVICE_NAME
    system: $SYSTEM_ID
    app_version: $PROJECT_VERSION
    tier: app

有一种很好的方法来构建新的yaml或更改包含所有参数值的现有yaml?

3 个答案:

答案 0 :(得分:1)

YAML并不总是需要模板,因为它是结构化数据。只要您不需要格式化/评论,就可以使用js-yaml读取或转储对象。

const yaml = require('js-yaml')
const fs   = require('fs')

const kyaml = {
  metadata: {
    name: project_name,
    service: service_name,
    system: system_id,
    app_version: project_version,
    tier: 'app',
  }
}

fs.writeFile('new.yaml', yaml.safeDump(kyaml), 'utf8', err => {
  if (err) console.log(err)
})

此外,helm你可能正在做templates已经可以为你做的事情。

答案 1 :(得分:0)

我决定使用Handlebars module 只需向函数提供一个模板,其中包含我要解析的参数,该函数将创建包含所有更改的新文件

const Handlebars = require('handlebars');
const source = fs.readFileSync(`${cwd}/${file}`).toString();
const template = Handlebars.compile(source);
const contents = template({ PROJECT_NAME: `${name}`, PROJECT_VERSION: `${version}`, DOCKER_IMAGE: `${image}` });
fs.writeFileSync(`${cwd}/target/${file}`, contents);
console.log(`${file} -- Finish parsing YAML.`);

和JSON看起来像

spec:
  containers:
    - name: {{PROJECT_NAME}}:{{PROJECT_VERSION}}
      resources:
        limits:
          memory: "1Gi"
          cpu: "1"

      image: {{DOCKER_IMAGE}}

答案 2 :(得分:0)

任何模板引擎都可以工作,但是如果模板值有可能会产生编码错误,则应该对模板值进行适当的转义。由于YAML是JSON的超集,因此subset_columns可以安全地用作有效的YAML转义函数。

使用Mustache模板,我们通过设置转义功能来确保所有模板值均被转义:

JSON.stringify

使用车把,我们可以通过禁用默认转义并提供“ json”助手来产生有效的YAML:

const mustache = require('mustache')
mustache.escape = JSON.stringify
mustache.render(template, vars)

只要值可能需要转义,就需要在YAML模板中使用json帮助器:

const handlebars = require('handlebars')
const render = handlebars.compile(template, { noEscape: true })
render(vars, {helpers: { json: JSON.stringify }}))

如果值包含换行符或YAML特殊字符(如“ |”),则在没有适当的YAML转义的情况下,生成的YAML文档中可能会出现编码错误。默认情况下,某些模板引擎(例如Mustache和Handlebars)将使用HTML编码转义值,如果值中包含HTML特殊字符(例如,引号转为“'”),也会产生编码错误。