0
$ cat foo.libsonnet
{
    local foo = 99,
    bar: [ foo, 101 ]
}
$ cat baz.jsonnet
{
    local foo = import 'foo.libsonnet',
    baz: [foo.foo, foo.bar]
}
$ jsonnet baz.jsonnet
RUNTIME ERROR: field does not exist: foo
        baz.jsonnet:3:11-18     thunk <array_element>
        baz.jsonnet:3:10-28     object <anonymous>
        During manifestation

在这个例子中,很容易访问bar. foo有什么办法baz.jsonnet可以访问当地人foo.libsonnet吗?

如果答案是否定的,我应该如何实现foobaz以便我可以访问in both和 in的foo字段?foo.libsonnetfoo.libsonnetbaz.jsonnet

4

2 回答 2

2

baz.jsonnet 有什么方法可以访问 foo.libsonnet 的本地人吗?

不,当地人是当地人。它们只是某些词法范围内可用值的名称。特别是对象局部变量只能在对象定义中直接访问。

如果您想从对象外部访问一个值,它不应该是本地的 - 而是使用一个字段。如果您不希望在显示对象时显示它,则可以使用隐藏字段,如下所示:

$ cat foo.libsonnet
{
    foo:: 99, // double colon indicates that the field is hidden
    bar: [ self.foo, 101 ]
}
$ cat baz.jsonnet
{
    local foo = import 'foo.libsonnet',
    baz: [foo.foo, foo.bar]
}
$ jsonnet baz.jsonnet
{
   "baz": [
      99,
      [
         99,
         101
      ]
   ]
}
$ jsonnet foo.libsonnet
{
   "bar": [
      99,
      101
   ]
}
于 2020-04-10T09:03:48.913 回答
0

我想出了这个:

$ cat foo.libsonnet
{
    foo_parameters: {
        foo: 98
    },

    foo_objects: {
        local foo = $.foo_parameters,

        bar: [ foo.foo, 101 ]
    }
}
$ cat baz.jsonnet
{
    local foo = import 'foo.libsonnet',
    baz: [foo.foo_parameters.foo, foo.foo_objects.bar]
}
$ jsonnet baz.jsonnet
{
   "baz": [
      98,
      [
         98,
         101
      ]
   ]
}

本质上是相同的问题和答案。

于 2020-04-10T01:20:38.613 回答