计算字段不能访问局部变量?

Computed fields cannot access local variables?

我有以下代码块:

local tst = {
  postgres: {
    test: {
      // params: ['blahblah'],
    },
  },
};

{
  [if std.length(std.objectFields(tst)) > 0 then 'aws_db_parameter_group']: {
    ['pgsql_%s' % db]: {
      local database = tst.postgres[db],  // <--- Here's my local scope var
      name: 'pgsql_%s' % db,
      [if 'params' in tst.postgres[db] then 'parameter']: database.params,
    }
    for db in std.objectFields(if 'postgres' in tst then tst.postgres else {})
  },
}

按预期工作:

> ./jsonnet tst.jsonnet
{
   "aws_db_parameter_group": {
      "pgsql_test": {
         "name": "pgsql_test"
      }
   }
}

但是,如果我更改行:

[if 'params' in tst.postgres[db] then 'parameter']: database.params,

收件人:

[if 'params' in database then 'parameter']: database.params,

Jsonnet 抛出错误:

> ./jsonnet tst.jsonnet
STATIC ERROR: tst.jsonnet:14:23-31: Unknown variable: database

我做错了什么?我可以解决这个问题吗?

> ./jsonnet --version
Jsonnet commandline interpreter v0.18.0

根据我的发现(不是 jsonnet 内部专家),您需要在 进入您正在使用的范围之前“完全”完成计算字段变量他们。

我是你的情况,下面修复它:

local tst = {
  postgres: {
    test: {
      params: ['blahblah'],
    },
    test_noparam: {
    },
  },
};

{
  [if std.length(std.objectFields(tst)) > 0 then 'aws_db_parameter_group']: {
    local database = tst.postgres[db],  // <--- Here's the local var, finalized in _upper_ scope
    ['pgsql_%s' % db]: {
      name: 'pgsql_%s' % db,
      [if 'params' in database then 'parameter']: database.params,
    }
    for db in std.objectFields(if 'postgres' in tst then tst.postgres else {})
  },
}