我正在寻找可以将运行时参数从我的程序解析为yaml文件的节点模块(或其他东西)。
例如在kubernetes yamls
metadata:
name: $PROJECT_NAME
labels:
service: $SERVICE_NAME
system: $SYSTEM_ID
app_version: $PROJECT_VERSION
tier: app
有一种很好的方法来构建新的yaml或更改包含所有参数值的现有yaml?
答案 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)
})
答案 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特殊字符(例如,引号转为“'”),也会产生编码错误。