首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jsonnet库进行继承

使用jsonnet库进行继承
EN

Stack Overflow用户
提问于 2019-09-04 08:35:16
回答 2查看 1.4K关注 0票数 0

我有一个关于import JSONNet功能的问题。我喜欢是能够导入一个主libsonnet文件,该文件本身是由多个导入组成的,并且能够访问该导入中的所有内容。

我有以下示例结构:

代码语言:javascript
复制
.
├── library_one
│   └── init.libsonnet
├── library_two
│   └── init.libsonnet
├── init.libsonnet
└── test.jsonnet

每个文件的内容如下:

library_one/init.libsonnet

代码语言:javascript
复制
{
  local LibraryOne = self,

  some_function(some_argument='default'):: [
    'echo "The argument was %s"' % some_argument,
  ],
}

library_two/init.libsonnet

代码语言:javascript
复制
{
  local LibraryTwo = self,

  some_other_function(some_other_argument='another_default'):: [
    'echo "The other argument was %s"' % some_other_argument,
  ],
}

最后,根目录下的“主”文件init.libsonnet

代码语言:javascript
复制
local library_one = import 'library_one/init.libsonnet';
local library_two = import 'library_two/init.libsonnet';

{}

但是,当我使用以下内容运行文件test.jsonnnet时:

代码语言:javascript
复制
local master = import 'init.libsonnet';

{
  some_key: master.library_one.some_function,
  some_other_key: master.library_two.some_other_function,
}

我知道错误:

代码语言:javascript
复制
RUNTIME ERROR: field does not exist: library_one
    test.jsonnet:4:13-31    object <anonymous>
    During manifestation

难道这种继承是不可能的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-05 10:48:30

请先看一下@jjo的答案。

我只想补充一句,构建库是可能的,也是合理的,这样您就可以拥有本地的“声明”,然后使用对象“导出”它,我认为这与您所描述的类似。

library.libsonnet

代码语言:javascript
复制
local sqr(x) = x * x;

local cube(x): x * x * x;

{
    sqr: sqr,
    cube: cube,
}

然后你可以像这样使用:

代码语言:javascript
复制
local lib = import 'library.libsonnet';

[
    lib.sqr(2),
    lib.cube(3) + lib.sqr(4),
]

这种风格也可以相当好的性能。您可以在这里查看一个真实的示例:https://github.com/sbarzowski/jsonnet-modifiers/blob/master/modifiers.libsonnet

至于“主库”,您实际上可以将这些部分添加到您的init.libsonnet

代码语言:javascript
复制
local library_one = import 'library_one/init.libsonnet';
local library_two = import 'library_two/init.libsonnet';

library_one + library_two

如果library_one和library_two包含相同的字段,则优先考虑library_two。您可以在官方网站https://jsonnet.org/learning/tutorial.html#oo上阅读更多关于Jsonnet中的继承规则的内容。

票数 3
EN

Stack Overflow用户

发布于 2019-09-04 11:46:14

local符号不导出,因为没有“全局”作用域本身,而是{...}主对象的字段:

修改源代码以使用主对象字段:

代码语言:javascript
复制
::::::::::::::
library_one/init.libsonnet
::::::::::::::
{
  local LibraryOne = self,

  some_function(some_argument='default'):: [
    'echo "The argument was %s"' % some_argument,
  ],
}
::::::::::::::
library_two/init.libsonnet
::::::::::::::
{
  local LibraryTwo = self,

  some_other_function(some_other_argument='another_default'):: [
    'echo "The other argument was %s"' % some_other_argument,
  ],
}
::::::::::::::
init.libsonnet
::::::::::::::
{
  library_one:: import 'library_one/init.libsonnet',
  library_two:: import 'library_two/init.libsonnet',
}
::::::::::::::
test.jsonnet
::::::::::::::
local master = import 'init.libsonnet';

{
  some_key:: master.library_one.some_function,
  some_other_key:: master.library_two.some_other_function,

  foo: $.some_key("bar")
}

样本输出:

代码语言:javascript
复制
{
   "foo": [
      "echo \"The argument was bar\""
   ]
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57784555

复制
相关文章

相似问题

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