如何从 bash 调用参数化的 Jsonnet?
How to call parameterized Jsonnet from bash?
我不明白如何最好地参数化 Jsonnet 文件,以便我可以从 bash 和另一个 Jsonnet 文件调用同一个文件。
假设我有一个名为 template.jsonnet 的简单模板:
{
// Required arguments
name:: error "'name' must be specified",
port:: error "'port' must be specified",
...,
}
我可以很容易地将它合并到另一个 Jsonnet 文件中,并提供其所需的参数值:
{
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() 的替代品,但我不明白如何使用它来满足我的需要。
后续问题是:如何为参数执行此操作这是一个数组:
{
local template = = import "./template.jsonnet";
template + {
name:: "service",
port:: [8080,8081,8082],
}
最直接的方法是使用一些内联 jsonnet:
jsonnet -e '(import "template.jsonnet") + { name: "service", port: 8080 }'
为了更轻松地进行参数化,您可以使用 extVars 或顶级参数 (TLA)。
jsonnet -e 'function(name, port) (import "template.jsonnet") + { name: name, port: port }' --tla-str name="blah" --tla-code port='[8080, 8081]'
或
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
:
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文件中可以使用如下:
local template = import "./template.jsonnet";
{
filled_template: template(
name="service",
port=8080 // or port=[8080,8081,8082]
)
}
您可以使用 shell 中的模板,如下所示:
jsonnet --tla-code name='"some name"' --tla-code port=8080 template.jsonnet
请注意名称需要引号(如果没有外部 '
,它们将被 shell 解释)。那是因为您可以传递任何 jsonnet 代码,其计算结果为 tla-code
.
中的任何类型
如果你想逐字传递一个字符串,你可以使用--tla-str
:
jsonnet --tla-str name="some name" --tla-code port=8080 template.jsonnet
另一方面,您可以将数组(或对象,或任何 jsonnet 代码)传递给 --tla-code
:
jsonnet --tla-code name='"some name"' --tla-code port='[8080, 8081, 8082]' template.jsonnet
或者,如果您不想更改 template.jsonnet
,您可以使用包装文件来提供我描述的界面:
template_func.jsonnet:
local template = import "./template.jsonnet";
function(name, port) template + {
name: name,
port: port
}
我不明白如何最好地参数化 Jsonnet 文件,以便我可以从 bash 和另一个 Jsonnet 文件调用同一个文件。
假设我有一个名为 template.jsonnet 的简单模板:
{
// Required arguments
name:: error "'name' must be specified",
port:: error "'port' must be specified",
...,
}
我可以很容易地将它合并到另一个 Jsonnet 文件中,并提供其所需的参数值:
{
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() 的替代品,但我不明白如何使用它来满足我的需要。
后续问题是:如何为参数执行此操作这是一个数组:
{
local template = = import "./template.jsonnet";
template + {
name:: "service",
port:: [8080,8081,8082],
}
最直接的方法是使用一些内联 jsonnet:
jsonnet -e '(import "template.jsonnet") + { name: "service", port: 8080 }'
为了更轻松地进行参数化,您可以使用 extVars 或顶级参数 (TLA)。
jsonnet -e 'function(name, port) (import "template.jsonnet") + { name: name, port: port }' --tla-str name="blah" --tla-code port='[8080, 8081]'
或
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
:
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文件中可以使用如下:
local template = import "./template.jsonnet";
{
filled_template: template(
name="service",
port=8080 // or port=[8080,8081,8082]
)
}
您可以使用 shell 中的模板,如下所示:
jsonnet --tla-code name='"some name"' --tla-code port=8080 template.jsonnet
请注意名称需要引号(如果没有外部 '
,它们将被 shell 解释)。那是因为您可以传递任何 jsonnet 代码,其计算结果为 tla-code
.
如果你想逐字传递一个字符串,你可以使用--tla-str
:
jsonnet --tla-str name="some name" --tla-code port=8080 template.jsonnet
另一方面,您可以将数组(或对象,或任何 jsonnet 代码)传递给 --tla-code
:
jsonnet --tla-code name='"some name"' --tla-code port='[8080, 8081, 8082]' template.jsonnet
或者,如果您不想更改 template.jsonnet
,您可以使用包装文件来提供我描述的界面:
template_func.jsonnet:
local template = import "./template.jsonnet";
function(name, port) template + {
name: name,
port: port
}