0

我正在尝试创建一个具有一些默认值的模板,但如果提供了自定义值文件,则应覆盖这些默认值。问题是对象中的一些变量是从同一对象中的其他变量构建的,例如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 实现这一目标?

4

1 回答 1

1

std.mergePatch()将组合那些已经“最终确定”的对象,因此self无法覆盖字段。

添加这两个对象只需要+:能够从父字段派生:

jsonnet-stackoverflow-56971012.jsonnet 源代码:

local config = {
  fruit+: {
    name: 'banana',
    size: 'large',
  },
};

local myobj = {
  adjective: 'Good ' + self.fruit.name,
  fruit+: {
    name: 'apple',
    qty: 1
  },
};

myobj + config

jsonnet-stackoverflow-56971012.jsonnet 输出:

{
   "adjective": "Good banana",
   "fruit": {
      "name": "banana",
      "qty": 1,
      "size": "large"
   }
}

请注意+不需要myobj,尽管 IMO 最好将其保留在那里,以防您需要自己覆盖(未来的)基础对象。

于 2019-07-10T15:21:12.410 回答