【问题标题】:How to override 'self' in Jsonnet?如何在 Jsonnet 中覆盖“自我”?
【发布时间】:2019-07-10 12:45:38
【问题描述】:

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

产生(注意缺少默认的qty: 1):

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

如何使用 Jsonnet 实现这一点?

【问题讨论】:

    标签: jsonnet


    【解决方案1】:

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

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

    jsonnet-stackoverflow-56971012.jsonnet src:

    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 最好将其保留在那里,以防您需要自己覆盖(未来的)基础对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      相关资源
      最近更新 更多