首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从bash调用参数化Jsonnet?

如何从bash调用参数化Jsonnet?
EN

Stack Overflow用户
提问于 2018-01-24 07:28:44
回答 1查看 5.6K关注 0票数 9

我不知道如何最好地参数化一个Jsonnet文件,这样我就可以从bash和另一个Jsonnet文件中调用相同的文件。

假设我有一个名为template.jsonnet的简单模板:

代码语言:javascript
复制
{
  // Required arguments
  name:: error "'name' must be specified",
  port:: error "'port' must be specified",

  ...,
}

我可以很容易地将其合并到另一个Jsonnet文件中,并为其提供所需的参数值:

代码语言:javascript
复制
{
  local template = = import "./template.jsonnet";

  template + {
    name:: "service",
    port:: 8080,
}

我正在努力确定从bash调用template.jsonnet以达到相同结果的预期方式。

我可以使用--ext-str,但这似乎需要std.extVar(x)

A GitHub issue建议--tla-code可能是std.extVar()的替代方法,但是我不知道如何使用它来满足我的需要。

接下来的问题是:如何对参数执行此操作这是一个数组:

代码语言:javascript
复制
{
  local template = = import "./template.jsonnet";

  template + {
    name:: "service",
    port:: [8080,8081,8082],
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-24 14:20:32

最直接的方法是使用一些内联jsonnet:

代码语言:javascript
复制
jsonnet -e '(import "template.jsonnet") + { name: "service", port: 8080 }'

为了便于参数化,可以使用extVars或顶级参数(TLA)。

代码语言:javascript
复制
jsonnet -e 'function(name, port) (import "template.jsonnet") + { name: name, port: port }' --tla-str name="blah" --tla-code port='[8080, 8081]'

代码语言:javascript
复制
jsonnet -e '(import "template.jsonnet") + { name: std.extVar("name"), port: std.extVar("port") }' --ext-str name="blah" --ext-code port='[8080, 8081]'

更好的方法是使template.jsonnet成为一个函数,并使用--tla-code/ --tla-str

代码语言:javascript
复制
  function(name, port) {
    name:: name,
    port:: port
    // Sidenote: the fields are hidden here, because they use ::,
    // use : to make them appear when the object is manifested.
    // Sidenote 2: You can provide default argument values. 
    // For example function(name, port=8080) makes port optional.
  }

然后,在另一个jsonnet文件中,您可以按如下方式使用它:

代码语言:javascript
复制
local template = import "./template.jsonnet";
{

  filled_template: template(
    name="service",
    port=8080 // or port=[8080,8081,8082]
  )
}

您可以使用shell中的模板,如下所示:

代码语言:javascript
复制
jsonnet --tla-code name='"some name"' --tla-code port=8080 template.jsonnet

注意引号对于名称是多么的必要(如果没有外部',它们将被shell解释)。这是因为您可以在tla-code中传递任何计算结果为任何类型的jsonnet代码。

如果想要逐字传递字符串,可以使用--tla-str

代码语言:javascript
复制
jsonnet --tla-str name="some name" --tla-code port=8080 template.jsonnet

另一方面,您可以将数组(或对象或任何jsonnet代码)传递给--tla-code

代码语言:javascript
复制
jsonnet --tla-code name='"some name"' --tla-code port='[8080, 8081, 8082]' template.jsonnet

或者,如果您不想更改template.jsonnet,您可以使用包装文件来提供我所描述的接口:

template_func.jsonnet:

代码语言:javascript
复制
local template = import "./template.jsonnet";
function(name, port) template + {
  name: name,
  port: port
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48412535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档