2

我有一个接受布尔值作为参数的 jsonnet 函数。假设我有一个名为的 jsonnet 文件deploy.jsonnet

function (image='', isReady) {
local config = self,
deploy: if isReady then [ do deployment ]
else [don't do deployment]

我将值传递给此函数,例如:

jsonnet -A name=new-deployment -A isReady=true deploy.jsonnet

但问题是-A始终以字符串形式提供值,因此条件检查将失败并显示以下消息:

RUNTIME ERROR: Condition must be boolean, got string.
    ./deploy.jsonnet:(133:45)-(148:15)  object <anonymous>
    During manifestation

此外,我没有看到将字符串解析为布尔值的选项。

问题是 - 有没有办法将布尔值传递给 jsonnet 中的函数,或者我们可以将字符串解析为布尔值吗?

4

2 回答 2

2

是的,这是可能的,通过--tla-code(而不是-A),例如:

jsonnet -A name=new-deployment --tla-code isReady=true deploy.jsonnet

不同之处在于,它不是将值视为字符串,而是将其视为 jsonnet 代码。所以也可以通过这种方式传递对象、数组甚至函数。

关于将字符串转换为布尔值。虽然我认为没有内置的方法可以做到这一点,但很容易推出自己的功能:

local stringToBool(s) =
  if s == "true" then true
  else if s == "false" then false
  else error "invalid boolean: " + std.manifestJson(s);
于 2017-09-19T19:43:50.763 回答
1

jsonnet 不支持将值提供为布尔值,也不支持将字符串解析为布尔值,因此我将参数类型更改为字符串并进行字符串比较以解决上述布尔解析问题

function (image='', isReady='') {
local config = self,
deploy: if (isReady == 'true') then [ do deployment ]
else [don't do deployment]
于 2017-09-18T04:06:02.170 回答