我正在尝试创建一个具有一些默认值的模板,但如果提供了自定义值文件,则应覆盖这些默认值。问题是对象中的一些变量是从同一对象中的其他变量构建的,例如adjective: 'Good' + self.fruit
. 这不会被覆盖。
std.mergePatch
不会产生预期的结果,因为它渲染了整个对象(现在已经让我们这样做了self.fruit
),然后覆盖fruit
.
local myobj = {
adjective: 'Good ' + self.fruit.name,
fruit: {
name: 'apple',
qty: 1
},
};
myobj
当什么都没有被覆盖时产生正确的结果:
{
"adjective": "Good apple",
"fruit": {
"name": "apple",
"qty": 1
}
}
但是当我尝试用另一个变量覆盖它时,如果我std.mergePatch
按如下方式使用它仍然采用默认值:
local config = {
fruit: {
name: 'banana',
size: 'large',
},
};
local myobj = {
adjective: 'Good ' + self.fruit.name,
fruit: {
name: 'apple',
qty: 1
},
};
std.mergePatch(myobj, config)
产生(注意错误的水果名称adjective
):
{
"adjective": "Good apple",
"fruit": {
"name": "banana",
"qty": 1,
"size": "large"
}
}
如果我直接添加这两个对象,它会错过额外的信息:
local config = {
fruit: {
name: 'banana',
size: 'large',
},
};
local myobj = {
adjective: 'Good ' + self.fruit.name,
fruit: {
name: 'apple',
qty: 1
},
};
myobj + config
产生(注意缺少 default qty: 1
):
{
"adjective": "Good banana",
"fruit": {
"name": "banana",
"size": "large"
}
}
如何使用 Jsonnet 实现这一目标?