jsonnet顶级函数和数据不能在同一个文件中?

vsdwdz23  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(127)

我尝试用jsonnet自动生成嵌套的模板化json结构,考虑一个仓库结构,你有一个物理站点,在这个站点上有n1个仓库,这些仓库有n2个货架,而这些货架又有n3个货架,以此类推。
输出应该如下所示:

{
   "Sites": [
      {
         "SiteId": 1,
         "Warehouses": [
            {
               "SiteId": 1,
               "WarehouseId": "1-1"
            },
            {
               "SiteId": 1,
               "WarehouseId": "1-2"
            },
            {
               "SiteId": 1,
               "WarehouseId": "1-3"
            }
         ]
      },
      {
         "SiteId": 2,
         "Warehouses": [
            {
               "SiteId": 2,
               "WarehouseId": "2-1"
            },
            {
               "SiteId": 2,
               "WarehouseId": "2-2"
            },
            {
               "SiteId": 2,
               "WarehouseId": "2-3"
            }
         ]
      }
   ]
}

这里重要的是,这应该是模块化的(又名为网站,仓库,过道,机架单独的模板),我希望能够运行每个模块单独,而不是必须生成整个结构各地。
实际上我已经让他用下面的代码工作了:
一个一个一个一个一个x一个一个二个一个x一个一个三个一个x一个一个x一个四个一个
我可以分别运行warehouse.jsonnet和sites.jsonnet来生成仓库或包含仓库的站点。
然而,我正为两个问题而挣扎:
1.把这个放到两个文件中。正如你所看到的,我的解决方案需要jsonnet文件形式的“启动器”,除了运行libsonnet之外,它什么也不做。
1.另外还有冗余,例如属性名“Warehouses”同时出现在warehouses.jsonnet和sites.libsonnet中。
我尝试了我能想到的每一种排列,试图用各自libsonnet文件中的json模板在那里获得顶级函数,或者将冗余的属性名称放入生成属性内容的模板中,属性内容在语义上属于它。我搜索了Stackoverflow、博客、文档等,但我找不到任何有用的东西。我已经在这上面花了两天半的时间。所以我真的很感激这个平台上的大师们的建议。
我试着将json模板移动到函数本身中,或者将jsonnet文件中的顶级函数添加到json模板文件中,每次解析器都抱怨说在那个位置不需要函数。
有没有办法简化我的解决方案?

flvlnr44

flvlnr441#

请注意,import可以(大多数情况下)被认为是使用导入的内联复制代码。
我不确定我是否正确理解了您的意思(tbh我看到您的 library 方法相当可靠),尽管如此,下面的单个all.jsonnet将上述四个源代码合二为一,并在按照注解中的文档示例调用时按预期工作:

// all.jsonnet

// implementation copied-in from warehouses.libsonnet:
local warehouses = {
  warehouses(site, numWarehouses)::
    [
      {
        SiteId: site,
        WarehouseId: site + '-' + y,
      }
      for y in std.range(1, numWarehouses)
    ],
};

// implementation copied-in from sites.libsonnet:
local sites = {
  sites(numSites, numLocations)::
    [
      {
        SiteId: y,
        Warehouses: warehouses.warehouses(y, numLocations),
      }
      for y in std.range(1, numSites)
    ],
};

// Below is still a top-level function (all the above are locals) with "main" function
// keyed by `sites` (default) and `warehouses`.
// Use it as e.g.:
//   $ jsonnet all.jsonnet --tla-code s=42 --tla-code n=3
//   $ jsonnet all.jsonnet --tla-code s=42 --tla-code n=3 --tla-code f="'warehouses'"
function(s, n, f='sites')
  {
    // implementation copied-in from sites.jsonnet:
    sites:: function(s, n)
      {
        Sites: sites.sites(s, n),
      },
    // implementation copied-in from warehouses.jsonnet:
    warehouses:: function(site, numWarehouses)
      {
        Warehouses: warehouses.warehouses(site, numWarehouses),
      },
  }[f](s, n)

相关问题